2013-05-02 19 views
17

ऐसा लगता है कि matplotlib में एक आकृति बनाने का मानक तरीका व्यवहार नहीं करता है क्योंकि मैं पाइथन में अपेक्षा करता हूं: डिफ़ॉल्ट रूप से fig = matplotlib.figure() लूप में कॉल करने से सभी आंकड़े बनाए जाएंगे, और अंत में स्मृति से बाहर चला गया।संदर्भित एक आंकड़ा बनाएं जो संदर्भित है

quiteafew पदों जो समाधान के साथ सौदा कर रहे हैं, लेकिन matplotlib.pyplot.close(fig) को स्पष्ट कॉल की आवश्यकता होती है एक सा hackish लगता है। मुझे क्या चाहिए fig संदर्भ गणना करने का एक आसान तरीका है, इसलिए मुझे स्मृति रिसाव के बारे में चिंता करने की आवश्यकता नहीं होगी। क्या ऐसा करने का कोई तरीका है?

+1

यह वास्तव में अधिक नियमित स्मृति प्रबंधन की तरह, इस मामले में यह आंकड़ा एक बाहरी (एक फ़ाइल वर्णनकर्ता की तरह) विंडोइंग व्यवस्था करने के लिए संसाधन, और 'plt.figure()' निर्माता है, जबकि 'plt.close है (है है अंजीर) 'विनाशक है। यद्यपि 'clf' और 'cla' और अन्य के कारण विनाश के कई स्तर हैं। इस मामले में, ऐसा करने का उचित तरीका 'with' ब्रैकेटिंग मुहावरे (" संदर्भ प्रबंधक ") का उपयोग करना होगा। – CMCDragonkai

उत्तर

18

आप plt.figure का उपयोग किए बिना आंकड़ा बनाते हैं, तो फिर यह संदर्भ गिना आपकी अपेक्षा के अनुरूप होना चाहिए। उदाहरण (। यह गैर-सहभागी Agg बैकएंड का उपयोग कर, साथ ही है) के लिए

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
from matplotlib.figure import Figure 

# The pylab figure manager will be bypassed in this instance. 
# This means that `fig` will be garbage collected as you'd expect. 
fig = Figure() 
canvas = FigureCanvas(fig) 
ax = fig.add_subplot(111) 
+2

'चित्रा कनवस (अंजीर) के बिना' जब मैं आकृति को बचाने की कोशिश करता हूं तो मुझे अपवाद मिलता है। मैं इसे लेता हूं कि 'चित्रा' को हमेशा 'चित्रा कनवस' के साथ खींचा जाना चाहिए? – Shep

+2

हाँ! अन्यथा कुछ भी खींचा जा सकता है (कलाकार बनाए जाते हैं, लेकिन जब तक आप साजिश को सहेजते/दिखाते हैं तब तक ड्राइंग तब तक नहीं होती है)। यह एपीआई में एक वार्ट है; आदर्श रूप से कैनवास के साथ कैनवास शुरू किया जाएगा। यदि आप 'fig.savefig (फ़ाइल नाम) 'के बजाय' canvas.print_figure (filename) 'का उपयोग करते हैं, तो यह अधिक समझ में आ सकता है (जो वास्तव में दृश्यों के पीछे' fig.savefig' करता है)। यह पूरी तरह से आपकी समझ के लिए है, हालांकि (कैनवास बैकएंड-विशिष्ट भाग है जो ड्राइंग/बचत को संभालता है)। अंतिम परिणाम एक जैसा है। –

+1

हम्म, क्या कैनवास को बचाने से पहले बिल्कुल मौजूद होना चाहिए? मैं सोच रहा हूं कि 'चित्राकणवास (अंजीर) .print_figure (फ़ाइल नाम)' एक-पंक्ति प्रिंट फ़ंक्शन के रूप में काम करेगा। – Shep

2

आप केवल उन्हें प्रदर्शित आंकड़े बचत होने जा बजाय रहे हैं, तो आप उपयोग कर सकते हैं:

def savefig(*args, **kwargs): 
    plt.savefig(*args, **kwargs) 
    plt.close(plt.gcf()) 

यह तर्कसंगत रूप से कम हैकी नहीं है, लेकिन जो भी हो।

+0

धन्यवाद, लेकिन जब यह मुझे बताता है कि किसी आंकड़े को कैसे सहेजना है और इसे बंद करना है, तो यह सवाल का जवाब नहीं देता है- यह "कच्चे सूचक को आवंटित करने और फिर 'कॉल' के साथ" मैं सी ++ में स्मार्ट पॉइंटर्स का उपयोग कैसे करूं " 'जब आप इसके साथ कर रहे हैं "। – Shep

+0

यह उचित है, "मैं स्मृति लीक के बारे में चिंता कैसे नहीं कर सकता" के वैकल्पिक समाधान का सुझाव देता हूं जो अभी भी मानक 'plt' API का उपयोग करता है। –

संबंधित मुद्दे