python - 强制丢弃 Python Imaging Library 图像以回收内存

标签 python memory python-imaging-library

我有一个程序可以加载和处理大量这种形式的图像:

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/

相关文章:

python - 使用 cookie 进行 scrapy 身份验证登录

python - Mechanical Turk 边界框数据如何批量格式化?

Javascript 内存分析器

python - 使用python PIL粘贴时黑屏

python - 使用Image.show()打开图片时没有该文件

python - 使用 python 操作原始二进制图像数据

java - Bulkloader 导入整数列表

python - Pandas read_csv 在更改列数的情况下添加标题名称

c - 如何从内核板损坏报告中获取信息?

c++ - 如何检查内存限制