强制丢弃Python Imaging Library图像以回收内存
我有一个程序,它会加载和处理很多图片,像这样:
for fn in filenames:
im = Image.open(fn)
get_some_basic_stats(im)
当这个程序处理很多图片时,Python的内存使用量会变得非常大——远远超过任何一张图片应该占用的内存。可以想象,这最终会导致页面文件的频繁读写。
我猜测(虽然我并不是100%确定)这是因为之前的图片在内存中占用了空间,直到它们被垃圾回收机制清理掉。
有没有办法强制清除这些图片的内存呢?我在PIL参考文档中没有找到相关的方法。我想过使用del im
,但我了解到这只是把名字'im'从当前作用域中删除,实际上和在循环开始时重新赋值是一样的。
1 个回答
3
在Python中,没有什么东西是可以被明确销毁的。在CPython这个版本里,所有东西都是通过引用计数来管理的,也就是说,只要没有其他地方再引用它,它就会被自动释放。在你的情况中,这应该会在下一个循环迭代时发生。你可以通过运行 gc.collect()
来强制进行循环垃圾回收,但我怀疑这能解决你遇到的问题。
你可以尝试在循环结束时运行:print sys.getrefcount(im)
。这个命令会告诉你有多少个对象在引用这个图像。正常情况下应该是2(一个是局部变量的引用,一个是作为参数传给getrefcount的im)。如果这个数字更大,那就说明这个对象没有被释放的原因了。
你还可以查看 gc.getobjects()
,这个命令会返回Python系统中所有对象的列表。我建议写一个简单的循环,统计不同类型的对象数量并打印出来。看看有没有什么对象的数量在增加。