2013-05-03 158 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次以上的数字。