我在matplotlib.imshow中发现了内存泄漏。我知道类似的问题(比如Excessive memory usage in Matplotlib imshow),我已经阅读了相关的铁心线程(https://github.com/ipython/ipython/issues/1623/)。
我认为下面的代码应该(在没有内存泄漏的情况下)在运行时消耗恒定的内存量。相反,它随着每次迭代而增长。
我正在运行我能找到的最新版本(matplotlib-1.2.0rc3.win32-py2.7和numpy-1.7.0.win32-py2.7),问题仍然存在。我没有保留imshow的返回值,事实上我明确地删除它,所以我认为IronPython讨论中的注释不适用。
表示在循环中有明确的赋值和del的行为是相同的。我在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的显示阻止。
答案 0 :(得分:1)
我想我找到了一个解决方法,我没有完全意识到重量级的表现如何。
答案是只调用一次imshow,然后为每个后续图像调用带有RANDOM_MATRIX的set_data。
问题解决了!
答案 1 :(得分:0)
我努力使它起作用,因为许多帖子都谈到了这个问题,但是似乎没人在乎提供一个可行的示例。
首先,您永远不要使用from ... import *
语法,而在使用库时,您不会自己做-因为,您永远无法确定它没有声明会与您的符号冲突的符号。
然后,调用set_data
不足以解决此问题-出于以下三个原因:
flush_events()
。imshow()
,则设置数据将无法使用
可以用来设置它的颜色图。这是一个可行的解决方案
IMAGE_SIZE = 500
import numpy as np
import matplotlib.pyplot as plt
plt.ion()
fig1, ax1 = plt.subplots()
fig2, ax2 = plt.subplots()
# this example doesn't work because array only contains zeroes
array = np.zeros(shape=(IMAGE_SIZE, IMAGE_SIZE), dtype=np.uint8)
axim1 = ax1.imshow(array)
array[0, 0] = 99 # this value allow imshow to initialise it's color scale
axim2 = ax2.imshow(array)
del array
for _ in range(50):
print(".", end="")
matrix = np.random.randint(0, 100, size=(IMAGE_SIZE, IMAGE_SIZE), dtype=np.uint8)
axim1.set_data(matrix)
fig1.canvas.flush_events()
axim2.set_data(matrix)
fig1.canvas.flush_events()
print()