强制丢弃Python Imaging Library映像以回收内存



我有一个加载和处理大量图像的程序,格式如下:

for fn in filenames:
    im = Image.open(fn)
    get_some_basic_stats(im)

当Python进程在许多图像上运行时,最终会使用大量的内存——远远超过任何一个图像应该占的内存。不用说,这最终会导致页面文件的抖动。

我认为(虽然我不是100%确定,显然)这是因为以前的图像占用内存,直到它们被垃圾收集。

是否有办法强制丢弃它们?我无法在PIL参考中找到一个。我想使用del im,但我明白这将简单地从局部作用域中删除名称'im',并有效地在循环的顶部重新分配它。

python中没有任何东西可以显式销毁。在CPython中,所有东西都是引用计数的,所以一旦没有引用它,它就应该被释放。在您的例子中,这应该发生在循环的下一次迭代中。您可以通过运行gc.collect()来强制循环垃圾收集器,但我怀疑这将解决这里的问题。

你可以试试:print sys.getrefcount(im)在循环的末端。它会告诉你有多少物体引用了这个图像。它应该是2(一个用于本地变量,一个用于im作为getrefcount的参数)。如果它更大,那就解释了为什么对象没有被释放。

您还可以查看gc.getobjects(),它将返回python系统中所有对象的列表。我会编写一个快速循环,计算不同类型的对象并打印出来。查看计数是否有所上升

最新更新