为什么 PIL 打开某些 png 文件后不释放内存?

Paw*_*ech 5 python png image python-imaging-library

假设我有一项从网络获取图像并将其保存到目录的服务。我以 .png 文件形式获取输入并将其保存在本地。我使用 PIL 打开图像,并根据需要为其添加背景。我最近注意到处理某些 .png 文件时内存使用率很高。似乎当打开某些 .png 时,PIL 没有正确释放内存。

以下代码将演示会发生什么:

from PIL import Image
import resource

def check_mem(filename):
    mem = lambda:resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
    print mem()
    img = Image.open(filename)
    print mem()
    img = img.convert('RGBA')
    print mem()
    background = Image.new("RGBA", img.size, (255, 255, 255))
    print mem()
    image = background.paste(img, img)
    print mem()
    del background
    del img
    del image
    print mem()

if __name__ == "__main__":
    import sys
    check_mem(sys.argv[1])
Run Code Online (Sandbox Code Playgroud)

对于某些图像(例如像这样的图像),这会生成以下输出:

12416
12416
22508
22508
22508
22508
Run Code Online (Sandbox Code Playgroud)

您可以看到使用的内存几乎增加了一倍!即使最后我删除了所有对象,内存仍然是开始时的两倍。

对于其他图像,例如这一张内存使用情况不会改变:

12416
12416
12416
12416
12416
12416
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会发生这种情况?有什么办法可以避免这种情况吗?