EDIT:matplotlibのバックエンドを 'Qt4Agg'から 'Agg'に変更するとエラーなしでコードを実行できます。これはバックエンドのバグだと思いますか?MatplotlibとPyplot.close()はメモリを解放しませんか?バックエンドに関連するQt4Agg
かなり大量のデータを処理するためのコードを自動的に作成しています。コードはまずすべて自分のデータファイルを解析し、すべての関連ビットを格納します。私は必要なグラフをそれぞれ作成するために異なる機能を持っています(全部で約25種類あります)。しかし、何らかのメモリエラーが発生し続けています.Matplotlib/PyPlotがメモリを正しく解放していないためです。
各プロット関数はpyplot.close(fig)コマンドで終了し、グラフを保存して直ちにそれらを見ないので、は表示されません。にはpyplot.show()が含まれています。
私がインタプリタでプロット関数を個別に実行すると、問題は発生しません。しかし、順番に各プロット関数を呼び出す別の関数を作成すると、 "MemoryError:メモリをパスに割り当てることができませんでした"というエラーが発生します。
誰かがこのような問題に遭遇しましたか?それはMatplotlib runs out of memory when plotting in a loopに関連しているようですが、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を:パスメモリを割り当てることができませんでした」を得ます。
まで実行されます。それらを閉じる前に数字をクリアしようとしましたか? –
あなたは 'plt.clf()'を試しましたか? – moooeeeep
関数の最後にif/elifの後ろに「del fig」を追加してみてください。 –