4

我在 matplotlib.imshow 中发现了内存泄漏。我知道类似的问题(例如Matplotlib imshow 中的内存使用过多),并且我已经阅读了相关的 ironpython 线程(https://github.com/ipython/ipython/issues/1623/)。

我相信下面的代码应该(在没有内存泄漏的情况下)在运行时消耗恒定数量的内存。相反,它随着每次迭代而增长。

我正在运行我能找到的最新版本(matplotlib-1.2.0rc3.win32-py2.7 和 numpy-1.7.0.win32-py2.7),但问题仍然存在。我没有保留 imshow 的返回值,实际上我明确删除了它,所以我认为 IronPython 讨论中的注释不适用。无论是否在循环内显式赋值和删除,行为都是相同的。

我看到 matplotlib-1.2.0.win32-py2.7 的行为相同。

每次迭代似乎都挂在图像所需的任何内存上。我选择了一个大的 (1024x1024) 随机矩阵来使每个图像的大小变得非常大。

我正在运行带有 2G 物理 RAM、32 位 python2.7.3(因此出现内存错误)以及上述 numpy 和 matplotlib 包的 Win7 pro。下面的代码在迭代 440 左右时因内存错误而失败。windows 任务管理器在失败时报告消耗了 1,860,232K。

这是演示泄漏的代码:

IMAGE_SIZE = 1024
import random
RANDOM_MATRIX = []
for i in range(IMAGE_SIZE):
    RANDOM_MATRIX.append([random.randint(0, 100) for each in range(IMAGE_SIZE)])

def exercise(aMatrix, aCount):
    for i in range(aCount):
        anImage = imshow(aMatrix, origin='lower left', vmin=0, vmax=100)
        del(anImage)

if __name__=='__main__':
    from pylab import *
    exercise(RANDOM_MATRIX, 4096)

我大概可以用 PIL 而不是 matplotlib 来渲染图像。在没有解决方法的情况下,我确实认为这是 matplotlib 的阻碍。

4

2 回答 2

1

我努力使它工作,因为许多帖子都在谈论这个问题,但似乎没有人关心提供一个工作示例。

首先from ... import *,在使用不是您自己创建的库时,您永远不应该使用语法 - 因为,您永远无法确定它没有声明与您的符号冲突的符号。

那么,调用set_data不足以解决这个问题 - 出于三个原因:

  1. 你没有提到这个 set_data 是从哪里调用的。它不是普通函数,而是来自对象的方法……哪个对象?
  2. 如果您没有东西可以“激活”更改,则仅 set_data 是不够的。有时它会透明地发生,因为另一个情节激活了它,但如果没有,您将需要flush_events()自己调用。
  3. imshow()如果您没有使用可用于设置颜色图的值调用设置数据,则设置数据将不起作用。

这是一个有效的解决方案(链接):

于 2020-07-13T16:34:31.577 回答
0

我想我找到了一种解决方法,我没有完全意识到 imshow 是多么的重量级。

答案是只调用一次 imshow,然后为每个后续图像调用带有 RANDOM_MATRIX 的 set_data。

问题解决了!

于 2013-03-11T18:42:08.360 回答