我在 matplotlib.imshow 中发现了内存泄漏。我知道类似的问题(如 Excessive memory usage in 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 的阻碍。
最佳答案
我努力使它工作,因为许多帖子都在谈论这个问题,但似乎没有人关心提供一个工作示例。
首先,你不应该使用 from ... import *
语法,当使用一个不是你自己创建的库时——因为,你永远不能确定它没有声明一个与你的冲突的符号。
然后,调用set_data
不足以解决这个问题 - 出于三个原因:
普通函数,但来自对象的方法......哪个对象?
“激活”更改。有时它会透明地发生
因为另一个情节激活了它,但如果没有,你将需要
调用
flush_events()
自己。 imshow()
设置数据无效有它的值(value)可以用来设置它的颜色图。
这是一个可行的解决方案(link):
关于memory-leaks - matplotlib imshow 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15345336/