【问题标题】:Python PIL: Cropping multiple images leads to freeze up and memory leakPython PIL:裁剪多个图像会导致冻结和内存泄漏
【发布时间】:2022-08-23 16:10:10
【问题描述】:

我正在尝试使用 PIL 裁剪多个图像(数千张)并将结果保存到磁盘。然而,在仅仅裁剪了 100 张图像并成功保存之后,该程序使用了 17.5 GB 的 RAM,并且需要很长时间才能创建下一个裁剪。之后,它只再输出两张尺寸为 65535×65535 像素的图像(原始图像都是 1920x1080),然后循环完成。

我的代码:

import PIL
from PIL import Image
PIL.Image.MAX_IMAGE_PIXELS = 4294836225

for path in paths:
   with Image.open(path) as img:
      left, top, right, bottom = calculate_crop(...)
      cropped = img.crop((left, top, right, bottom))
      cropped.save(new_path, \'png\')
      cropped.close()

没有任何异常被触发(我也尝试过使用 try/except)。我在这里做错了什么或者这可能是图书馆中的错误吗?

    标签: python python-imaging-library crop freeze


    【解决方案1】:

    好的,根据PIL memory leak github forum,问题是处理程序停止调用文件上的 .close() 方法,或者至少不立即执行。我建议自己手动打开和关闭文件。然而,这可能只能解决部分问题。

    【讨论】:

    • 我尝试了从手动关闭文件到使用 with 语句的所有方法,但没有什么能阻止这种泄漏。我只是为此使用OpenCV。
    • 好主意。抱歉,我无法提供更多帮助。
    【解决方案2】:

    我在裁剪大量图像时遇到了类似的问题。 加载不是问题。我使用了一个循环,在其中加载了数千张图像,但裁剪似乎存在内存泄漏。 我有一个

    PIL.Image.DecompressionBombError: Image size (933120000 pixels) exceeds limit of 178956970 pixels, could be decompression bomb DOS attack.

    当我设置Image.MAX_IMAGE_PIXELS = None 时,它只会淹没我的记忆!!

    所以看起来 PIL 中确实存在内存泄漏!

    还有其他人有这个问题吗?已经有修复了吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      相关资源
      最近更新 更多