2009-10-29 4 views
16

में मैन्युअल कचरा संग्रह क्या कोई ऑब्जेक्ट मैन्युअल रूप से निकालने का कोई तरीका है जिसे कचरा संग्रह से छुटकारा पाने से इंकार कर दिया जाता है जब भी मैं gc.collect() पर कॉल करता हूं? पायथन 3.0पायथन

+1

पायथन के बारे में पता नहीं है लेकिन कुछ कचरा कलेक्टर कभी-कभी गलती से सोचते हैं कि चीजें अभी भी उपयोग में हैं क्योंकि उन्हें लगता है कि इन वस्तुओं के संदर्भ में * क्या दिखाई देने वाला * दिखाई देता है (लेकिन वास्तव में नहीं)। ऐसे मामलों में आप इतना कुछ नहीं कर सकते हैं। – Artelius

+1

इसके अलावा, आपको पायथन 3.1 ASAP पर जाना चाहिए। 3.0 में कई ज्ञात समस्याएं हैं और अब समर्थित नहीं है। –

+2

जैसे ही मैं सम्मान खत्म करता हूं, मेरा इरादा है। – Casebash

उत्तर

24

the docs के अनुसार, gc.get_referrers(thatobject) आप से अवगत कराएगा वस्तु अभी भी जीवित है (सही एक gc.collect() के बाद यह कर सुनिश्चित करें कि अवांछित "जीवंतता" बनाने के लिए लगातार बनेगा)। उसके बाद, यह किसी भी तरह का काला कला है ;-)। आपको अक्सर पता चलेगा कि कुछ रेफरर्स सूचियां हैं (तो क्यों यह सूची thatobject का जिक्र है? आप .remove इसे आपातकालीन मोड में कर सकते हैं, लेकिन सामान्य कोड ध्वनि बनाना बेहतर है ...), और, और भी अक्सर, dict एस (जिनमें से कई __dict__ एस कुछ वर्ग उदाहरण या अन्य के हो सकते हैं - अक्सर यह पता लगाने के लिए तुच्छ नहीं है कि ... फिर, ब्रूट-फोर्स हटाने कभी-कभी एक आपातकालीन आपातकालीन समाधान होता है, लेकिन कभी भी एक टिकाऊ लंबी दूरी नहीं है -)।

1

पर काम करना यह आपके पायथन पर चल रहा है इस पर निर्भर करता है। Here's good article कि विवरण

का हवाला देते हुए बताते हैं:

CPython की वर्तमान विज्ञप्ति में, लूप के अंदर एक्स के लिए प्रत्येक नया असाइनमेंट पहले से आवंटित संसाधन जारी करेंगे। जीसी का उपयोग करना, इसकी गारंटी नहीं है। यदि आप कोड लिखना चाहते हैं जो किसी भी पायथन कार्यान्वयन के साथ काम करेगा, तो आपको संसाधन को स्पष्ट रूप से बंद करना चाहिए; इस जीसी की परवाह किए बिना काम करेंगे:

for name in big_list: 
    x = Resource() 
    do something with x 
    x.close() 
4

जीसी इसे नष्ट करने के लिए मना किया गया है, क्योंकि आप इसे करने के लिए एक संदर्भ कहीं यह है। संदर्भ से छुटकारा पाएं और यह (अंत में) जाएगा। उदाहरण के लिए:

myRef = None 

ध्यान रखें कि जीसी जरूरी अपने वस्तु नहीं नष्ट कर सकते हैं, जब तक यह करने की जरूरत में रखें।

यदि आपकी ऑब्जेक्ट पाइथन के प्रबंधन के तहत संसाधनों को नहीं रखती है (उदाहरण के लिए, पाइथन से सी कोड के साथ कुछ चालबाजी), ऑब्जेक्ट को संसाधन रिलीज कॉल प्रदान करना चाहिए ताकि जब आप पाइथन निर्णय लेते हैं तो आप इसे कर सकते हैं ।

4

del या None अपने केवल दोस्त हैं

>>> a = "Hello" 
>>> a = None 
Or 
>>> del a 
+1

जरूरी नहीं कि सच है। ऑब्जेक्ट को पुनः प्राप्त करने के योग्य होने के लिए केवल पहुंच योग्य (या एक स्वीकार्य रूप से डिस्पोजेबल रेफ-गिनती है, जो बहुत उम्मीदवार से सहमत है) होने की आवश्यकता है। –

+5

'del a' ऑब्जेक्ट को हटा नहीं देता है (केवल एक नोट; इसका अर्थ यह नहीं है कि आप इसका मतलब है) – hasen