2013-05-03 157 views
4

我正在使用迭代循環來使用Matplotlib繪製所有數據。當代碼保存了大約768張圖時,它會引發以下異常。在循環中保存Matplotlib圖時的內存溢出

RuntimeError: Could not allocate memory for image 

我的電腦有大約3.5 GB的RAM。 有沒有任何方法可以平行釋放內存,使內存不會耗盡?

回答

7

當你完成這些工作後,你還記得close的數字嗎?例如:

import matplotlib.pyplot as plt 

#generate figure here 
#... 
plt.close(fig) #release resources associated with fig 
+1

是的,我沒有關閉這個數字。非常感謝。但我收到一個異常:Traceback(最近調用最後一個):文件「C:\ Python27 \ lib \ site-packages \ matplotlib \ backends \ backend_qt4.py」,第156行,在 lambda:self.close_event())文件「C:\ Python27 \ lib \ site-packages \ matplotlib \ backend_bases.py」,第1564行,在close_event中self.callbacks.process(s,event)RuntimeError:包裝的C/C++對象類型FigureCanvasQTAgg已被刪除 – tanzil 2013-05-03 14:24:53

+0

似乎喜歡與後端之一搞笑的東西。你在修改哪些後端被合併? (FWIW,我懷疑我會知道這個答案,可能值得在稍微調查一下後再打開另一個問題) – mgilson 2013-05-03 14:26:38

+3

這是QT4後端的一個錯誤,它們被輕微的破壞,C++對象在'mpl'被真正完成之前,被'pyqt'釋放和清理。忽略這些錯誤是安全的,並且它已經被固定在主幹上(我不記得這個修復是否使它進入了1.2錯誤修復版本) – tacaswell 2013-05-03 22:35:48

3

作爲一個稍微不同的答案,請記住你可以重複使用數字。例如:

fig = plt.figure() 
ax = plt.gca() 

im = ax.imshow(data_list[0],...) 

for new_data in data_list: 
    im.set_cdata(new_data) 
    fig.savefig(..) 

這將使您的代碼運行得更快,因爲它不需要設置和拆卸700次以上的數字。