2010-10-14 10 views
11

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

इस का एक सरल उदाहरण:

>>> tupdict = {} 
# consumes around 2 GB of memory 
>>> for i in xrange(12500000): 
... tupdict[i] = (i,i) 
... 
# delete over half the entries, no drop in consumed memory 
>>> for i in xrange(7500000): 
... del tupdict[i] 
... 
>>> import gc 
# manually garbage collect, still no drop in consumed memory after this 
>>> gc.collect() 
0 
>>> 

मैं कल्पना क्या हो रहा है कि हालांकि प्रविष्टियों नष्ट हो जाती हैं और कचरा कलेक्टर रन अजगर आगे बढ़ो नहीं करता है और शब्दकोश का आकार बदलने के लिए है। मेरा सवाल यह है कि, क्या इसके आसपास कोई आसान तरीका है, या क्या मुझे अपने कार्यक्रम को लिखने के बारे में और अधिक गंभीर पुनर्विचार की आवश्यकता है?

+0

आप मेमोरी खपत को कैसे माप रहे हैं? – stonemetal

+0

कुछ भी फैंसी नहीं - उबंटू –

+0

में सिस्टम मॉनीटर विंडोज एक्सपी एसपी 3 पर पायथन 2.6.5 पर 'gc.collect() 'चल रहा है, स्मृति के लगभग 50% को मुक्त करता है –

उत्तर

18

कई कारक इस बात को देखते हैं कि पाइथन इस स्मृति को अंतर्निहित ओएस पर लौटाता है या नहीं, शायद यह है कि आप यह बताने की कोशिश कर रहे हैं कि स्मृति को मुक्त किया जा रहा है या नहीं। सीपीथॉन में एक पूल आवंटित प्रणाली है जो स्मृति को मुक्त करने के लिए रखती है ताकि इसे एक कुशल तरीके से पुन: उपयोग किया जा सके (लेकिन बाद के आवंटन आपके ओएस के परिप्रेक्ष्य से आपकी स्मृति पदचिह्न को बढ़ाएंगे), जो हो सकता है कि आप ' देख रहे हैं

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

अंत में, विलुप्त प्रक्रिया मेमोरी का प्रबंधन कैसे करें ऑपरेटिंग सिस्टम का दायरा है, और विभिन्न योजनाएं (अपसाइड और डाउनसाइड्स के साथ) उपयोग की जाती हैं जैसे कि आपके सिस्टम सूचना उपकरण को पसंद करने के लिए जरूरी नहीं है आप पूरी सच्चाई

5

आप सही हैं कि यदि शब्दकोश से आइटम हटा दिए जाते हैं तो पाइथन शब्दकोश को वापस नहीं बदलता है। इसका ओएस मेमोरी प्रबंधन और कचरा संग्रह से कोई लेना-देना नहीं है, यह पाइथन के निर्देश डेटा संरचना का कार्यान्वयन विवरण है।

पुराना शब्दकोश कॉपी करके एक नया शब्दकोश बनाना एक कामकाज है। अधिक जानकारी के लिए इस महान वीडियो को देखें: http://pyvideo.org/video/276/the-mighty-dictionary-55 (लगभग 26:30 उत्तर है)।