2010-01-07 11 views
17

मेरे पास कोड उदाहरण नहीं है, लेकिन मुझे उत्सुकता है कि क्या पाइथन कोड लिखना संभव है जिसके परिणामस्वरूप अनिवार्य रूप से एक स्मृति रिसाव होता है।क्या आपके कोड के कारण पायथन में वास्तविक मेमोरी लीक हो सकती है?

+2

आपको स्पष्टीकरण देना चाहिए: प्रक्रिया समाप्त होने के बाद आप लीक मेमोरी के बारे में बात कर रहे हैं; और क्या आप शुद्ध पायथन के बारे में बात कर रहे हैं जिसमें सी सी मॉड्यूल नहीं हैं? –

उत्तर

46

यह संभव है, हाँ।

यह इस बात पर निर्भर करता है कि आप किस प्रकार की स्मृति रिसाव के बारे में बात कर रहे हैं। शुद्ध पायथन कोड के भीतर, सी में जैसे स्मृति को "मुक्त करना" भूलना संभव नहीं है, लेकिन कहीं भी लटकने वाला संदर्भ छोड़ना संभव है। इस तरह के कुछ उदाहरण:

  • एक बिना क्रिया ट्रैस बैक उद्देश्य यह है कि एक पूरी ढेर फ्रेम को जीवित रखने के है, भले ही समारोह नहीं रह गया है उदाहरण के दायरे के बजाय एक वर्ग या वैश्विक क्षेत्र में

  • भंडारण मूल्यों चल रहा है , और इसे महसूस नहीं कर रहा है।

  • कक्षाओं में चक्रीय संदर्भ जिसमें __del__ विधि भी है। विडंबना यह है कि __del__ का अस्तित्व चक्रीय कचरा कलेक्टर के लिए एक उदाहरण को साफ करने के लिए असंभव बनाता है।

  • खराब ढंग से कार्यान्वित सी एक्सटेंशन, या सी पुस्तकालयों का सही ढंग से उपयोग नहीं कर रहे हैं, जैसा कि उन्हें माना जाता है।

  • कार्यक्षेत्र जो बंदी जो भी बहुत कुछ शामिल आप

  • डिफ़ॉल्ट पैरामीटर जो परिवर्तनशील प्रकार के होते हैं प्रत्याशित कर सकता था की तुलना में शामिल होते हैं:

def foo(a=[]): 
    a.append(time.time()) 
    return a 

और बहुत अधिक .....

+3

म्यूटेबल डिफ़ॉल्ट पैरामीटर का अच्छा उल्लेख। वे खतरनाक हैं क्योंकि वे जिस तरह से काम करते हैं वह वास्तव में सहज नहीं है, बल्कि इसलिए कि अगर आप देखभाल नहीं करते हैं तो वे काफी बढ़ सकते हैं ... foo विधि कार्यान्वयन का उल्लेख करने के लिए +1 –

+0

+1। मुझे नहीं पता था! –

+0

क्या आप अपनी पहली बुलेट पर कुछ दस्तावेज विस्तृत या प्रदान कर सकते हैं "एक अनचाहे ट्रेसबैक ऑब्जेक्ट जो पूरे स्टैक फ्रेम को जीवित रख रहा है, भले ही फ़ंक्शन अब नहीं चल रहा हो"? मेरे पास वास्तव में एक ट्रेसबैक रिसाव है लेकिन यह देखने में असफल रहा कि इसे कहीं भी संदर्भित क्यों किया जाता है (https://stackoverflow.com/questions/44681681/what-could-prevent-a-traceback-from-being-garbage-collected) – BiAiB

6

बेशक आप कर सकते हैं। मेमोरी रिसाव का सामान्य उदाहरण यह है कि यदि आप एक कैश बनाते हैं जिसे आपने मैन्युअल रूप से फ्लश नहीं किया है और इसमें कोई स्वचालित निष्कासन नीति नहीं है।

+3

तकनीकी रूप से यह मेमोरी रिसाव नहीं है क्योंकि एप्लिकेशन अभी भी ** सक्षम है ** स्मृति को रिलीज़ करने के लिए सक्षम है, हालांकि यह नहीं चुनता है। – Justin

+2

ठीक है, मुझे लगता है कि हम "स्मृति रिसाव" को अलग-अलग परिभाषित करते हैं। मेरे लिए एक रिसाव एक रिसाव है, इस पर ध्यान दिए बिना कि इसे ठीक करना संभव है या नहीं। –

+0

यदि उसके पास कैश से तत्वों को निकालने के लिए कोड नहीं है तो यह उन्हें हटाने में सक्षम नहीं है, है ना? –

1

गुंजाइश से बाहर निकलने के बाद आवंटित वस्तुओं की अनाथता के अर्थ में क्योंकि आप उन्हें हटाना भूल गए, नहीं; पायथन स्वचालित रूप से स्कोप ऑब्जेक्ट्स से बाहर हो जाएगा (Garbage Collection)। लेकिन इस अर्थ में @ एन्शन के बारे में बात कर रही है, हां।

7

एक स्मृति रिसाव की क्लासिक परिभाषा याद है कि एक बार इस्तेमाल किया गया था, और अब नहीं है, लेकिन फिर से दावा नहीं किया गया है। शुद्ध पायथन कोड के साथ यह लगभग असंभव है। लेकिन एंटोनी बताते हैं कि, डेटा संरचनाओं को बाध्य किए बिना बढ़ने की अनुमति देकर आप आसानी से अपनी सभी मेमोरी का उपभोग करने का असर डाल सकते हैं, भले ही आपको सभी डेटा को चारों ओर रखने की आवश्यकता न हो।

सी एक्सटेंशन के साथ, निश्चित रूप से, आप अप्रबंधित क्षेत्र में वापस आ गए हैं, और कुछ भी संभव है।

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