संपादित करें: यदि मैं 'Qt4Agg' से matgotlib के लिए बैकएंड को 'एजीजी' में बदलता हूं तो मैं बिना किसी त्रुटि के अपने कोड को चलाने में सक्षम हूं। मुझे लगता है कि यह बैकएंड में एक बग है?Matplotlib और Pyplot.close() स्मृति जारी नहीं कर रहे हैं? - बैकएंड संबंधित Qt4Agg
मैं स्वचालित रूप से डेटा की एक बड़ी मात्रा को संसाधित करने के लिए कुछ कोड लिख रहा हूं। सबसे पहले कोड मेरी डेटा फ़ाइलों को पार करता है और सभी प्रासंगिक बिट्स स्टोर करता है। मेरे पास आवश्यक प्रत्येक ग्राफ के उत्पादन के लिए अलग-अलग फ़ंक्शन हैं (सभी में लगभग 25 हैं)। हालांकि, मैं किसी प्रकार की मेमोरी त्रुटि में चल रहा हूं और मुझे लगता है कि ऐसा इसलिए है क्योंकि Matplotlib/PyPlot स्मृति को सही ढंग से जारी नहीं कर रहा है।
प्रत्येक साजिश रचने समारोह एक pyplot.close (छवि) कमांड के साथ समाप्त होता है और के बाद से मैं सिर्फ रेखांकन को बचाने के लिए और उन पर नहीं लग रहे चाहते तुरंत वे नहीं एक pyplot.show शामिल करते हैं()।
यदि मैं एक दुभाषिया में व्यक्तिगत रूप से साजिश कार्यों को चलाता हूं तो मुझे कोई समस्या नहीं होती है। हालांकि, अगर मैं एक अलग फ़ंक्शन करता हूं जो प्रत्येक प्लॉटिंग फ़ंक्शन को बदले में कॉल करता है तो मैं "मेमोरी एरर: पथ के लिए स्मृति आवंटित नहीं कर सका" में चला जाता हूं।
क्या कोई इस तरह की समस्या से आया है? यह Matplotlib runs out of memory when plotting in a loop से संबंधित प्रतीत होता है लेकिन pyplot.close() मेरी समस्या को ठीक नहीं करता है। मैं अब एक टर्मिनल
MyClass.TypicalPlot(save=True, show = False)
में चलाते हैं तो मैं किसी भी त्रुटि नहीं मिलता है
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)
:
यह एक ठेठ साजिश समारोह मेरी कोड में कैसा दिखता है। मेरे सभी साजिश कार्यों के लिए भी यही सच है।
अगर मैं एक नया कार्य जो ऐसा करता है:
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
फ़ंक्शन के अंत में 'del fig' जोड़ने का प्रयास करें, उसके बाद/elif के आजादी के बाद। –