2009-02-10 9 views
30

संभव डुप्लिकेट:
Python memory profilerमुझे अपने पायथन कार्यक्रम में मेमोरी लीक कैसे मिल सकता है?

मैं एक काफी जटिल (लगभग 20,000) लाइन अजगर प्रोग्राम है जो कुछ विकास के बाद लेने वाली स्मृति की मात्रा में वृद्धि जब इसे चलाता शुरू कर दिया है मिल गया है। यह पता लगाने के लिए कि कौन सी मेमोरी का उपयोग किया जा रहा है, सबसे अच्छा टूल और तकनीक क्या हैं?

आमतौर पर यह ऑब्जेक्ट्स, या विस्तार मॉड्यूल की बग्स के अप्रत्याशित रूप से संदर्भों को संदर्भित करता है (जो विशेष रूप से संभव नहीं है क्योंकि हम थोड़ी देर के लिए पाइथन 2.4 स्थापना का उपयोग कर रहे हैं)।

हम ट्विस्ट, ट्विस्टेड कॉंच और MySQLdb जैसे विभिन्न तृतीय पक्ष पुस्तकालयों का उपयोग कर रहे हैं।

+1

कृपया बंद करें - यह एक डुप्लिकेट –

+0

इस विषय पर पहले से ही एक [प्रश्न] (http://stackoverflow.com/questions/110259/python-memory-profiler/110826) था। – Seb

उत्तर

1

पायथन की स्मृति कचरा कलेक्टर द्वारा प्रबंधित की जाती है। आम तौर पर, स्मृति लीकिंग (निश्चित रूप से Python2.5 और ऊपर के लिए नहीं) के साथ कोई समस्या नहीं होनी चाहिए, जब तक कि आप सी/सी ++ में एक्सटेंशन मॉड्यूल लिखने के लिए न हों। उस स्थिति में, वालग्रिंड (ब्लॉग पोस्ट - http://bruynooghe.blogspot.com/2008/12/finding-memory-leaks-in-python.html) सहायक हो सकता है। मैंने पाया कि इस व्यक्ति - http://mg.pov.lt/blog/hunting-python-memleaks ने मेमोरी लीक का पता लगाने के लिए पीडीबी और मैटलप्लिब का उपयोग किया है। मुझे उम्मीद है कि यह मदद करता है, मुझे पाइथन मेमोरी लीक को ठीक करने का कोई अनुभव नहीं है।

+15

एक जटिल कार्यक्रम में, कभी-कभी आप इसे किसी वस्तु के बिना किसी ऑब्जेक्ट का संदर्भ रखेंगे। यह कचरा कलेक्टर स्मृति को पुनः प्राप्त करने में असमर्थ बनाता है। जिस तरह से सेबस्तजन से जुड़ा सवाल बेहतर है; मैं वास्तव में क्या चाहता हूं यह देखना है कि मेरी याददाश्त कहां उपयोग की जा रही है। –

+0

टिप्पणी डिकॉन के लिए धन्यवाद। में इसे याद रखूंगा। – batbrat

14

आम तौर पर, कर्सर को बंद करने में विफल होने पर स्मृति लीक के सबसे आम प्रकारों में से एक है। कचरा कलेक्टर कर्सर में शामिल MySQL संसाधन नहीं देख सकता है। MySQL को पता नहीं है कि पाइथन पक्ष तब तक जारी किया गया जब तक कि close() विधि स्पष्ट रूप से नहीं कहा जाता है।

अंगूठे का नियम। खोलें, का उपयोग करें और कर्सर को जितना छोटा कोड कोड प्रबंधित कर सकते हैं उतना ही कम करें।

+0

मैं यह जानने का प्रयास कर रहा हूं कि मेरा सिस्टम प्रोग्राम में संसाधन क्यों नहीं छोड़ेगा, और यह बिल्कुल ठीक था। इतनी छोटी बात है, लेकिन जब हजारों डीबी प्रश्न पूछते हैं, तो यह बहुत तेज़ हो जाता है! – Shakesbeery

+0

लगता है जैसे आपको एक कथन और एक आरएआईआई जैसी कक्षा का उपयोग करना चाहिए ताकि आप बंद करना न भूलें, भले ही अपवाद फेंक दिए जाएं। –

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