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

强制丢弃Python映像库映像以回收内存,python,memory,python-imaging-library,Python,Memory,Python Imaging Library,我有一个加载和处理大量图像的程序,其形式如下: for fn in filenames: im = Image.open(fn) get_some_basic_stats(im) 当在多个映像上运行时,Python进程最终会使用大量内存——远远超过任何一个映像所应使用的内存。不用说,这最终会导致页面文件被破坏 我假设(虽然我显然不是100%确定)这是因为以前的图像在被垃圾收集之前一直占用内存 有没有办法强行丢弃它们?我在房间里找不到一个。我曾想过使用del im,但我明白这只会

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

for fn in filenames:
    im = Image.open(fn)
    get_some_basic_stats(im)
当在多个映像上运行时,Python进程最终会使用大量内存——远远超过任何一个映像所应使用的内存。不用说,这最终会导致页面文件被破坏

我假设(虽然我显然不是100%确定)这是因为以前的图像在被垃圾收集之前一直占用内存


有没有办法强行丢弃它们?我在房间里找不到一个。我曾想过使用
del im
,但我明白这只会从本地范围中删除名称“im”,实际上与在循环顶部重新分配它是一样的。

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

你可以试试:
在循环结束时打印sys.getrefcount(im)
。它将告诉您有多少对象引用了该图像。它应该是2(一个用于局部变量,一个用于im作为getrefcount的参数)。如果它更大,那么这就解释了为什么对象没有被释放


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

这是真的,Python中的任何东西都无法销毁;但对于诸如PIL之类的外部模块来说,这并不一定是正确的打印出每种类型的计数的想法听起来很棒,所以我先试试。@Edmund,没错,外部模块可以提供他们喜欢的任何API。我不知道有哪种方法支持释放对象。(其他资源,如sockets/files/etc是,但内存,否)作为旁注:您可能希望检查。它不是对您的问题的直接回答,但使用它可能会让您绕过某些不可避免的代码行为。