我有一个加载和处理大量图像的程序,格式如下:
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系统中所有对象的列表。我会编写一个快速循环,计算不同类型的对象并打印出来。查看计数是否有所上升