我有一个程序可以加载和处理大量这种形式的图像:
for fn in filenames:
im = Image.open(fn)
get_some_basic_stats(im)
当在许多图像上运行时,Python 进程最终会使用大量内存——远远超过任何一张图像应占的内存。不用说,这最终会导致页面文件崩溃。
我假设(虽然我不是 100% 肯定,显然)这是因为以前的图像在被垃圾收集之前一直在占用内存。
有没有办法强制丢弃它们?我无法在 PIL reference 中找到一个.我想过使用 del im
,但我知道这只会从本地范围中删除名称“im”,实际上与在循环顶部重新分配它相同。
最佳答案
python 中的任何内容都不能显式销毁。在 CPython 中,所有内容都是引用计数的,因此一旦没有引用它就应该将其释放。在您的情况下,应该在循环的下一次迭代中发生。您可以通过运行 gc.collect()
强制循环垃圾收集器,但我怀疑这能否解决这里的问题。
你可以试试:
在循环结束时打印 sys.getrefcount(im)
。它会告诉您有多少对象引用了图像。它应该是 2(一个用于局部变量,一个用于 im 作为 getrefcount 的参数)。如果它更大,那么就可以解释为什么对象没有被释放。
您还可以查看 gc.getobjects()
,它将返回 python 系统中所有对象的列表。我会写一个快速循环来计算不同类型的对象并打印它们。查看计数是否有任何变化。
关于python - 强制丢弃 Python Imaging Library 图像以回收内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8665199/