2010-04-20 21 views
8

मैं अपने पायथन एप्लिकेशन में मेमोरी रिसाव को हल करने पर काम कर रहा हूं।पायथन - मेमोरी लीक

यहाँ बात है - यह वास्तव में केवल विंडोज सर्वर 2008 (नहीं R2), लेकिन Windows के नहीं पहले के संस्करणों पर हुआ प्रतीत होता है, और यह भी है कि यह लिनक्स पर हो रहा है नहीं लगता है (हालांकि मैं लगभग के रूप में नहीं किया है लिनक्स पर ज्यादा परीक्षण)।

यह निवारण के लिए, मैं कचरा कलेक्टर पर डिबगिंग की स्थापना:

gc.set_debug(gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_INSTANCES | gc.DEBUG_OBJECTS) 

फिर, समय-समय पर, मैं gc.garbage की सामग्री को लॉग इन करें।

बात यह है कि, gc.garbage हमेशा खाली रहता है, फिर भी मेरी स्मृति उपयोग ऊपर और ऊपर जाती है।

बहुत परेशान।

+9

डेव, स्पष्ट रूप से आपकी समस्या लाइन 123 को हटाकर तय की जा सकती है .... और लाइन 27 में i = 1 जोड़ें ... –

+0

गंभीरता से, मुझे आपकी मदद करने के लिए लगता है हमें कुछ कोड चाहिए .. –

+1

सेमी-डुप्लिकेट (या आपके लिए पढ़ने के लिए एक दिलचस्प धागा हो सकता है): http://stackoverflow.com/questions/1435415/python-memory-leaks/1435426#1435426 (यदि यह विफल हो जाता है, तो विवरण के साथ वापस आएं) – ChristopheD

उत्तर

2

कभी भी बेहतर देर से नहीं। इसे बहुत जल्दी हल किया लेकिन जवाब पोस्ट करना भूल गया। हमने ट्विस्ट कोड को फिसलने और चेरीपी का उपयोग करके समाप्त कर दिया।यह हल्का, उपयोग करने में आसान तरीका है, और ऐसा नहीं लगता है। ऐसा लगता है कि यह हमारी गलती थी कि यह हो रहा था और मुड़ नहीं गया था, लेकिन कोड इतना बुरा था कि हमने अभी पुनः लिखने का फैसला किया है कि यह सबसे आसान होगा।

+0

यह एक जवाब नहीं है –

26

यदि gc.garbage में कभी भी कोई कचरा नहीं है, तो मुझे यकीन नहीं है कि आप जीसी डीबगिंग सक्षम करके क्या करने की कोशिश कर रहे हैं। निश्चित रूप से, यह आपको बताएगा कि सफाई के लिए कौन सी वस्तुओं पर विचार किया जाता है, लेकिन यह विशेष रूप से दिलचस्प नहीं है यदि आप बिना परिपत्र संदर्भों को समाप्त करते हैं जिन्हें साफ़ नहीं किया जा सकता है।

अपने कार्यक्रम में अधिक से अधिक स्मृति का उपयोग कर रहा है ओएस के अनुसार, वहाँ आम तौर पर खेल में चार अलग-अलग मामलों हो सकता है:

  1. आपका आवेदन अधिक से अधिक बातें भंडारण किया जाता है, तो वे हर एक के लिए संदर्भ में रखते हुए इकट्ठा मत हो।
  2. आपका आवेदन वस्तुओं कि gc मॉड्यूल द्वारा साफ नहीं किया जा सकता है के बीच वृत्तीय संदर्भ पैदा कर रही है (उनमें से आम तौर पर, क्योंकि एक एक __del__ विधि है।)
  3. आपका आवेदन मुक्त कराने जाता है (और फिर से उपयोग करते हुए) स्मृति, लेकिन ओएस नहीं चाहता कि स्मृति फिर से उपयोग की जाए, इसलिए यह स्मृति के नए ब्लॉक आवंटित करता रहता है।
  4. रिसाव एक वास्तविक स्मृति रिसाव है लेकिन एक सी/सी ++ एक्सटेंशन मॉड्यूल में आपका कोड उपयोग कर रहा है।

अपने विवरण से यह लग रहा है जैसे कि यह संभावना नहीं है # 1 (के रूप में यह किसी भी ओएस पर एक ही व्यवहार करते हैं होता है) और जाहिरा तौर पर # 2 नहीं या तो ध्यान में रखते # 3 (gc.garbage में कुछ भी नहीं। वहाँ के बाद से), विंडोज होने के लिए (सामान्य रूप से) में एक स्मृति आवंटक होता है जो विखंडित आवंटन के साथ कुख्यात रूप से खराब होता है, लेकिन पाइथन malloc() के लिए obmalloc फ्रंटेंड के साथ इसके आसपास काम करता है। यह अभी भी Windows Server 2008 सिस्टम लाइब्रेरीज़ में एक मुद्दा विशिष्ट हो सकता है जो इसे आपके एप्लिकेशन की तरह दिखता है, हालांकि, अधिक से अधिक स्मृति का उपयोग कर रहा है। या यह # 4 के एक मामले में, एक C/C++ विस्तार मॉड्यूल, या अजगर या एक विस्तार मॉड्यूल द्वारा प्रयुक्त DLL, एक स्मृति रिसाव के साथ हो सकता है।

3

सामान्य रूप से, पाइथन में मेमोरी लीक के लिए पहला अपराधी सी एक्सटेंशन में पाया जाना है।
क्या आप उनमें से किसी का उपयोग करते हैं?

इसके अलावा, आप कहते हैं कि समस्या केवल 2008 पर होती है; इसके बाद मैं किसी भी असंगतता के लिए एक्सटेंशन की जांच करूंगा, क्योंकि विस्टा और 2008 के साथ बहुत सारे छोटे बदलाव हुए थे जो उस क्षेत्र पर मुद्दों का कारण बनते थे।
के रूप में और विकल्प, Windows XP चुनने विंडोज संगतता मोड में अपने आवेदन निष्पादित करने के लिए, कोशिश - इस मुद्दे को हल करने में मदद कर सकता है, खासकर अगर यह सुरक्षा में परिवर्तन से संबंधित है।

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