【问题标题】:How can I find out why using PIL functions is resulting in a memory error?如何找出使用 PIL 函数会导致内存错误的原因?
【发布时间】:2011-10-14 01:31:04
【问题描述】:

我正在使用 PIL(python 图像库)进行一些图像处理,特别是我正在将图像拼接在一起。

我的代码似乎适用于少量图像,但有时我会收到MemoryError

对我来说特别奇怪的部分是我没有对位图像进行操作,它全部适用于 10kb 以下的

我给Image.resize打了很多电话,但我很惊讶会出现重大问题。

这是堆栈轨迹:

Traceback (most recent call last):                                                                                                                                               
  File "test.py", line 15, in <module>                                                                                                                                           
    pprint(scale_matrix_down((90,90), [inpt]))                                                                                                                                   
  File "/Users/jeremykarmel/Desktop/Python/merger.py", line 105, in scale_matrix_down                                                                                            
    return [shrinkRow(row, row_width_overflow(row)) for row in matrix]                                                                                                           
  File "/Users/jeremykarmel/Desktop/Python/merger.py", line 103, in shrinkRow                                                                                                    
    rest         = [shrinkIm(im, pixels_per_im) for im in row[remaining_pixels:]]                                                                                                
  File "/Users/jeremykarmel/Desktop/Python/merger.py", line 110, in shrinkIm                                                                                                     
    return im.resize((im.size[0] - num_pix, im.size[1] - num_pix))                                                                                                               
  File "/Library/Python/2.7/site-packages/PIL/Image.py", line 1302, in resize                                                                                                    
    im = self.im.resize(size, resample)                                                                                                                                          
MemoryError

请注意,图片均小于 90x90 像素。

我陷入了死胡同,真的不知道如何进行。我该怎么做才能释放内存?我应该打电话给 del 运营商还是我可以做一些更简单的事情? 提前感谢您的帮助!

【问题讨论】:

  • 检查以确保您没有调整到负尺寸。当你运行进程时观察你的内存使用情况,看看内存在死前是否在增加。
  • 谢谢温斯顿,你完全正确!

标签: python memory python-imaging-library


【解决方案1】:

解释实际发生的情况:

  1. 您尝试将图像调整为负宽度
  2. PIL 尝试分配一个负尺寸的图像以适应调整后的图像
  3. PIL 调用具有负内存量的 malloc 以保存负大小的图像
  4. malloc 采用未签名的 size_t。因此,负内存请求被解释为一个非常大的数字,而不是一个负数。
  5. malloc 不能分配大的东西,所以会产生错误
  6. 对于 PIL,这看起来完全像内存不足错误,因此它会报告它

因此,无效输入不会导致泄漏或其他不良行为。它们导致错误的 malloc 请求并放弃。 PIL 可以检查负大小,从而产生更好的错误消息。也许他们认为它不值得,因为如果你这样做,它已经产生了错误消息。

事实上,实际上耗尽内存是很困难的,因为操作系统会非常努力地保持进程运行,例如使用虚拟内存。您的系统将在内存耗尽之前陷入困境。所以我发现大多数内存不足错误是由对负内存量的请求引起的。据我所知,我遇到的唯一真正的内存不足错误是在 Java 中,这可能是因为它使用了虚拟机。

【讨论】:

    【解决方案2】:

    事实证明,这实际上不是内存错误。正如 Winston Ewert 指出的那样,我实际上是在将负参数输入到图像调整大小方法中。

    尽管 python 文档说内存错误是因为内存问题,但是当你给负参数来调整大小时,这个错误就会被抛出。我的怀疑是,因为 PIL 大量利用 C 库,这些可能导致输入无效的泄漏,并且由于库不进行边界检查,因此错误只会冒泡。

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 2016-11-20
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多