2013-03-11 58 views
3

我在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的展示器。

+1

確認。這不是內存泄漏(或實際上是一個顯示塞)。當你打電話給imshow時,你每次都會向Axes實例添加一個新圖像。刪除「anImage」引用不會*從*軸中刪除圖像。正如你的解決方案所建議的那樣,你可以在Image實例上設置''set_data'',或者改爲調用''anImage.remove()''從Axes中移除圖像。 HTH – pelson 2013-03-12 09:23:47

回答

1

我想我找到了一個解決方法,我沒有完全意識到重量級imshow是多少。

答案是隻調用imshow一次,然後用RANDOM_MATRIX爲每個後續圖像調用set_data。

問題解決!

+1

作爲一個說明,圖中有一大堆對'anImage'的引用,所以刪除你的本地引用不會做任何事情。你可能有更好的運氣添加'anImage.remove()'。我不會說這是一個解決方法,因爲這不是一個錯誤。它表現得很好,完全按照你所說的去做(即使那不是你的意思)。 – tacaswell 2013-03-12 01:14:54