我在matplotlib.imshow中發現了內存泄漏。我知道類似的問題(如Excessive memory usage in Matplotlib imshow),並且我已經閱讀了相關的烙鐵線程(https://github.com/ipython/ipython/issues/1623/)。matplotlib中的內存泄漏imshow
我相信下面的代碼應該(在沒有內存泄漏的情況下)在運行時消耗一定量的內存。相反,它隨着每次迭代而增長。
我正在運行我能找到的最新版本(matplotlib-1.2.0rc3.win32-py2.7和numpy-1.7.0.win32-py2.7),問題仍然存在。我沒有保留imshow的返回值,事實上我明確地刪除它,所以我認爲IronPython討論中的註釋不適用。行爲與循環內部和外部的明確assign-and-del相同。
我看到與matplotlib-1.2.0.win32-py2.7相同的行爲。
每次迭代似乎都掛在圖像所需的任何內存上。我 選擇了一個大的(1024x1024)隨機矩陣,使每個圖像的大小有趣的大。
我正在運行與物理RAM,32位python2.7.3(因此內存錯誤),以及上述numpy和matplotlib軟件包2G的Win7專業版。下面的代碼在迭代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的展示器。
確認。這不是內存泄漏(或實際上是一個顯示塞)。當你打電話給imshow時,你每次都會向Axes實例添加一個新圖像。刪除「anImage」引用不會*從*軸中刪除圖像。正如你的解決方案所建議的那樣,你可以在Image實例上設置''set_data'',或者改爲調用''anImage.remove()''從Axes中移除圖像。 HTH – pelson 2013-03-12 09:23:47