2015-07-15 14 views
7

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

import random 
import sys 
import uuid 

a= {} 
for i in range(0, 100000): 
    a[uuid.uuid4()] = uuid.uuid4() 
    if i % 1000 == 0: 
     print sys.getsizeof(a) 

for i in range(0, 100000): 
    e = random.choice(a.keys()) 
    del a[e] 
    if i % 1000 == 0: 
     print sys.getsizeof(a) 

print len(a) 

पहले पाश की अंतिम पंक्ति 6291736 है। दूसरी लूप की अंतिम पंक्ति 6291736 भी है। और शब्दकोश का आकार 0 है।

तो इस समस्या से निपटने के लिए कैसे? क्या स्मृति की रिहाई को मजबूर करने का कोई तरीका है?

पीएस: वास्तव में यादृच्छिक करने की ज़रूरत नहीं है - मैंने दूसरे लूप की सीमा के साथ खेला।

+0

आप पुराने की सामग्री के साथ एक नया शब्दकोश बनाने का प्रयास कर सकते हैं, और पुराने के संदर्भ को हटा सकते हैं। – iobender

+0

किस बिंदु पर? समय पर? मैं लिखने को कैसे रोकूं? – Schultz9999

+0

पायथन की 'थ्रेडिंग', 'मल्टीप्रोसेसिंग', और 'एसिन्सीओ' मॉड्यूल * सभी * आपको 'लॉक' जैसे लगभग समान सिंक्रनाइज़ेशन प्राइमेटिव प्रदान करते हैं। मैं लागू मॉड्यूल के दस्तावेज में देखना शुरू कर दूंगा। – brenns10

उत्तर

2

यह "रीहाशिंग" करने का तरीका है, इसलिए यह एक नई शब्दकोश बनाने और सामग्री को कॉपी करने के लिए कम स्मृति का उपयोग करता है।

अजगर शब्दकोश कार्यान्वयन इस वीडियो में वास्तव में अच्छी तरह समझाया गया है:

https://youtu.be/C4Kc8xzcA68

एक atendee यह एक ही सवाल (https://youtu.be/C4Kc8xzcA68?t=1593) पूछ, और जवाब वक्ता द्वारा दिए गए है है:

आकार केवल प्रविष्टि पर गणना की जाती है; एक शब्दकोष के रूप में यह बहुत कम डमी प्रविष्टियों को प्राप्त करता है और जैसा कि आप फिर से भरते हैं, यह सिर्फ उन लोगों को स्टोर करने के लिए पुन: उपयोग करना शुरू कर देगा। [...] आपको चाबियों और मूल्यों को एक नए शब्दकोश

+1

केवल-लिंक के जवाब अच्छे जवाब नहीं हैं। –

+1

मैं बस सबकुछ बंद नहीं कर सकता - अनुरोध एसिंक फैशन में आ रहे हैं। निश्चित रूप से पायथन एसिंक मॉडल क्रुक्ड है लेकिन फिर भी कोई गारंटी नहीं है कि जब मैं एक शब्दकोश से दूसरे में डेटा ले जाता हूं, तो स्रोत में कोई भी बदलाव नहीं होगा। – Schultz9999

+1

यह स्टॉप-द-वर्ल्ड कचरा संग्रह की तरह बहुत कुछ लगता है, और उसी तरह आप लॉक का उपयोग कर सकते हैं ताकि एसिंक अनुरोधों को फिर से बनाया गया हो। लॉक के बारे में अधिक जानकारी: https://docs.python.org/2/library/threading.html – franciscod

1

असल में एक शब्दकोश आकार बदलने पर संकीर्ण हो सकता है, लेकिन आकार केवल एक प्रमुख डालने पर नहीं होता है।

पुनर्गठन तालिका एक नई तालिका का आवंटन और सभी आइटम फिर से पुन: लगाने से: यहाँ dictresize के लिए CPython source से एक टिप्पणी है। जब प्रविष्टियां हटा दी जाती हैं, तो नई तालिका वास्तव में पुरानी से छोटी हो सकती है।

वैसे, के बाद से अन्य जवाब PyCon 2010 शब्दकोश पर Brandon Rhodes talk उद्धरण, और बोली से ऊपर के साथ बाधाओं (जो साल के लिए किया गया है) पर हो रहा है, मैंने सोचा कि मैं पूर्ण शामिल होंगे बोल्ड में लापता हिस्से के साथ उद्धरण।

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

तो वह कहता है कि आकार बदलने का ऑपरेशन "[शब्दकोश] को कम करने की जरूरत है" को समझ सकता है। लेकिन यह केवल सम्मिलित होता है।जाहिर है जब आकार बदलने के दौरान सभी चाबियों की प्रतिलिपि बनाते हैं, तो डमी कुंजी को हटाया जा सकता है, बैकिंग सरणी के आकार को कम कर देता है।

हालांकि यह स्पष्ट नहीं है कि यह कैसे हो सकता है, यही कारण है कि रोड्स बस सब कुछ एक नए शब्दकोश में कॉपी करने के लिए कहता है।

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