编辑:如果我将matplotlib的后端从'Qt4Agg'显式更改为只是'Agg',那么我就能够无错误地运行我的代码。我认为这是后端中的一个错误吗?
我正在编写一些用于自动处理相当大量数据的代码。首先,该代码解析我的数据文件并存储所有相关位。然后,我有不同的函数来生成我需要的每个图形(总共约25个)。但是,我一直遇到某种内存错误,我认为这是因为Matplotlib / PyPlot没有正确释放内存。
每个绘图函数都以pyplot.close(fig)命令结束,由于我只想保存图形而不是立即查看它们,因此它们不包括pyplot.show()。
如果我在解释器中逐个运行绘图函数,则不会遇到任何问题。但是,如果我创建一个单独的函数,该函数依次调用每个绘图函数,那么我会遇到“MemoryError:Could not allocate memory for path”。
有人遇到过这样的问题吗?似乎与在循环中绘制时Matplotlib内存不足有关,但pyplot.close()并不能解决我的问题。这是我代码中典型的绘图函数:
def TypicalPlot(self, title=None, comment=False, save=False, show=True):
if title is None:
title = self.dat.title
fig = plt.figure()
host = SubplotHost(fig, 111)
fig.add_subplot(host)
par = host.twinx()
host.set_xlabel("Time (hrs)")
host.set_ylabel("Power (W)")
par.set_ylabel("Temperature (C)")
p1, = host.plot(self.dat.timebase1, self.dat.pwr, 'b,', label="Power",
markevery= self.skip)
p2, = par.plot(self.dat.timebase2, self.dat.Temp1, 'r,',
label="Temp 1", markevery= self.skip)
p3, = par.plot(self.dat.timebase2, self.dat.Temp2, 'g,',
label="Temp 2", markevery= self.skip)
p4, = par.plot(self.dat.timebase2, self.dat.Temp3, 'm,',
label="Temp 3", markevery= self.skip)
host.axis["left"].label.set_color(p1.get_color())
# par.axis["right"].label.set_color(p2.get_color())
#host.legend(loc='lower left')
plt.title(title+" Temperature")
leg=host.legend(loc='lower left',fancybox=True)
#leg.get_frame().set_alpha(0.5)
frame = leg.get_frame()
frame.set_facecolor('0.80')
### make the legend text smaller
for t in leg.get_texts():
t.set_fontsize('small')
### set the legend text color to the same color as the plots for added
### readability
leg.get_texts()[0].set_color(p1.get_color())
leg.get_texts()[1].set_color(p2.get_color())
leg.get_texts()[2].set_color(p3.get_color())
leg.get_texts()[3].set_color(p4.get_color())
if show is True and save is True:
plt.show()
plt.savefig('temp.png')
elif show is True and save is False:
plt.show()
elif show is False and save is True:
plt.savefig('temp.png')
plt.clf()
plt.close(fig)
如果我现在在终端中运行
MyClass.TypicalPlot(save=True, show = False)
然后我就不会收到任何错误信息。对于我所有的绘图函数也是如此。 如果我创建一个新的函数,它执行以下操作:
def saveAllPlots(self, comments = False):
if self.comment is None: comment = False
else: comment = True
self.TypicalPlot(save=True, show=False, comment=comment)
self.AnotherPlot(save=True, show=False)
self.AnotherPlot2(save=True, show=False)
self.AnotherPlot3(save=True, show=False)
...etc, etc, etc
然后它运行了大约一半的图表,然后我收到了“MemoryError: Could not allocate memory for path”的错误提示。
import gc
进行显式垃圾回收,并在每次循环迭代后使用gc.collect()
。 - Ferdinand van Wykfig = None
,然后再显式地调用gc.collect()
进行垃圾回收。 - RobertB