2013-12-10 4 views
16

पायथन gc.disable स्वत: कचरा संग्रह अक्षम करता है। जैसा कि मैं इसे समझता हूं, उसमें कुछ दुष्प्रभाव होंगे। कोई स्वचालित कचरा संग्रह अक्षम क्यों करना चाहेगा, और इसके बिना कोई प्रभावी ढंग से स्मृति कैसे प्रबंधित कर सकता है?कचरा कलेक्टर को अक्षम क्यों करें?

उत्तर

16

कचरा कलेक्टर को अक्षम करने के लिए एक उपयोग कोड के प्रदर्शन के समय के दौरान अधिक सुसंगत परिणाम प्राप्त करना है। The timeit module यह करता है।

def timeit(self, number=default_number): 
    if itertools: 
     it = itertools.repeat(None, number) 
    else: 
     it = [None] * number 
    gcold = gc.isenabled() 
    gc.disable() 
    ... 

In Python2 और Python3.2gc.disable() अप करने के लिए भी a bug caused by garbage collection occurring between fork and exec से बचने के लिए प्रयोग किया जाता है। पर कॉल करने की आवश्यकता के बिना समस्या को Python3.3 में ठीक किया गया प्रतीत होता है।

3

एक और यूज-केस मैन्युअल एक ही पृष्ठ आप लिंक से gc.collect()

+0

लेकिन जीसी को पहली बार 'gc.collect() 'का उपयोग करने में सक्षम होने की आवश्यकता को अक्षम कर रहा है? या 'gc.collect()' के लिए उपयोग-केस क्या है? (ध्यान दें: मेरे पास वास्तव में ऐसे सी # एप्लिकेशन में ऐसे उपयोग का मामला था जो <512 एमआईबी बॉक्स पर स्मृति से बाहर चला गया) –

+0

नहीं। आप किसी भी समय AFICK 'gc.collect()' 'को कॉल कर सकते हैं। –

6

साथ कचरा संग्रहण नियंत्रित करने के लिए किया जाएगा:

के बाद से कलेक्टर को पहले से ही अजगर में इस्तेमाल किया संदर्भ गिनती पूरा करता है, आप यदि आप सुनिश्चित हैं कि आपका प्रोग्राम संदर्भ चक्र नहीं बनाता है तो संग्राहक को अक्षम कर सकते हैं।

ताकि सवाल के दूसरे भाग का जवाब दिया जा सके, "इसके बिना कोई प्रभावी ढंग से स्मृति कैसे प्रबंधित कर सकता है"। संदर्भ चक्र न बनाएं। यह निश्चित रूप से काफी सीमित उपयोग केस है।

प्रश्न के पहले भाग के लिए उत्तर प्रदर्शन है। फिर, एक काफी सीमित उपयोग मामले।

जीसी को अक्षम करने से केवल तभी मदद मिलेगी जब (ए) जीसी वास्तव में काम कर रहा है, और (बी) यह काम कुछ भी नहीं प्राप्त कर रहा है, यह कहना है कि यह मुफ्त में कुछ भी नहीं ढूंढ रहा है, या इतना कम खोज रहा है कि आपको लगता है कि आपका प्रोग्राम आपका प्रोग्राम कर सकता है जीसी अक्षम होने तक रिसाव को सहन करें। इसलिए, यदि आपका प्रोग्राम बहुत धीमा है और संदर्भ चक्र नहीं बनाता है और जीसी को अक्षम करने की गति तेज होती है, तो आप जीसी को अक्षम करने पर विचार करेंगे।

मैं अनुमान लगाता हूं (मैंने देखा है कि पिछले जीसी के आधार पर, विशेष रूप से पाइथन नहीं है) कि यदि आप किसी भी स्मृति को आवंटित नहीं करते हैं तो कचरा कलेक्टर के पास कोई दीर्घकालिक प्रदर्शन लागत नहीं होगी। इसमें कुछ शॉर्ट-टर्म और अप्रत्याशित लागत हो सकती है जो पहले हो चुकी है। तो यहां तक ​​कि उस मामले में जहां आप बड़े पैमाने पर numpy संख्या-क्रंचिंग दिनचर्या में जा रहे हैं और आपको लगता है कि कोड के उस हिस्से से सभी संभावित प्रदर्शन को निचोड़ना चाहिए, जीसी को अक्षम करना, जबकि आप इसे अभी भी मदद नहीं करेंगे। जीसी को फिर से सक्षम करने के बाद तक यह पिछले संदर्भ चक्रों को दूर करने की समय लागत में देरी करेगा।

तर्कसंगत रूप से, प्रोग्राम जो कम समय तक चलते हैं और अधिक मेमोरी का उपयोग नहीं करते हैं उन्हें कचरा संग्रह की आवश्यकता नहीं होती है, वे लीक सहन कर सकते हैं। लेकिन इससे भी अधिक तर्कसंगत रूप से, यदि आप इस तरह सोचने लगते हैं तो आपको अंततः एक ऐसे कार्यक्रम के साथ परेशानी हो जाएगी जो आपके अपेक्षा से अधिक स्मृति को ले जाती है।

+0

समस्या यह है कि, व्यावहारिक रूप से, यह सुनिश्चित करने के लिए कठिन (सीमा रेखा असंभव) है कि आपके पास कोई संदर्भ चक्र नहीं है। आप आसानी से सुनिश्चित कर सकते हैं कि आपका कोड नहीं है, लेकिन आपकी निर्भरताओं के बारे में क्या? चूंकि मॉड्यूल, फ़ंक्शंस और क्लास आमतौर पर निर्दिष्ट नहीं करते हैं कि वे संदर्भ चक्र बनाते हैं, तो आपको प्रत्येक निर्भरता और पारगमन निर्भरता (मानक लाइब्रेरी समेत) के कोड से गुजरना होगा और यह सत्यापित करना होगा कि ऐसे कोई संदर्भ नहीं दिए गए हैं। और निश्चित रूप से, निर्भरता को अपग्रेड करना एक चक्र पेश कर सकता है। – Kevin

+0

@ केविन: बिल्कुल। मुझे लगता है कि मेरा उद्देश्य एक विडंबनापूर्ण अल्पसंख्यक होने के लिए "काफी सीमित" था। –

5

एक सक्षम जीसी के साथ समस्या हमेशा यह है कि जब आप ऐसा नहीं करेंगे। तो यदि आपका कार्यक्रम का एक हिस्सा समय-महत्वपूर्ण है, तो वास्तविक समय की आवश्यकता है, तो आप उस समय के लिए जीसी को अक्षम कर सकते हैं (उस हिस्से का हिस्सा)।

चाहे आप बाद में स्वचालित जीसी स्विच करना चाहते हैं या यदि आप gc.collect() पर कॉल करके इसे मैन्युअल रूप से करना पसंद करते हैं तो उस प्रश्न का कोई चिंता नहीं है।

इसके अलावा, कुछ प्रोग्राम केवल एक बहुत ही कम समय चलाने के लिए डिज़ाइन किए गए हैं, ताकि डेवलपर आश्वस्त कर सके कि उस समय के दौरान कोई स्मृति समस्या नहीं हो सकती है (ls जैसे प्रोग्रामों पर विचार करें); तो प्रदर्शन के पक्ष में पूरे जीसी पहलू को उपेक्षित किया जा सकता है।

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