2011-03-17 15 views
6

पर पायथन स्ट्रिंग मेमोरी उपयोग मैं फ्रीब्स पर पाइथन स्ट्रिंग के साथ एक अजीब स्मृति उपयोग पैटर्न देख रहा हूं। निम्नलिखित सत्र पर पर विचार करें। आइडिया एक ऐसी सूची बनाना है जिसमें तार हैं ताकि सूची में संचयी वर्ण 100 एमबी हो।फ्रीबीएसडी

l = [] 
for i in xrange(100000): 
    l.append(str(i) * (1000/len(str(i)))) 

यह उम्मीद के अनुसार लगभग 100 एमबी मेमोरी का उपयोग करता है और 'डेल एल' इसे साफ़ कर देगा।

l = [] 
for i in xrange(20000): 
    l.append(str(i) * (5000/len(str(i)))) 

यह 165 एमबी मेमोरी का उपयोग कर रहा है। मुझे वास्तव में समझ में नहीं आता कि अतिरिक्त मेमोरी उपयोग कहां से आ रहा है। [दोनों सूचियों का आकार समान है]

फ्रीबीएसडी 7.2 पर पायथन 2.6.4। लिनक्स/विंडोज़ पर केवल 100 एमबी मेमोरी का उपयोग करता है।

अद्यतन: मैं 'ps aux' का उपयोग कर स्मृति को माप रहा हूं। उपरोक्त कोड स्निपेट के बाद os.sytem का उपयोग करके निष्पादित किया जा सकता है। इसके अलावा इन्हें अलग से निष्पादित किया गया था।

अद्यतन 2: 2 के गुणकों में freebsd mallocs स्मृति की तरह दिखता है तो 5KB आवंटित करने से वास्तव में 8KB आवंटित होता है। मुझे यकीन नहीं है हालांकि।

+0

क्या पहले कोड के दूसरे टुकड़े को क्रियान्वित तो पहले एक को क्रियान्वित करने के बारे में? मुझे लगता है कि यह 165 एमबी होगा क्योंकि यह ऑपरेटिंग सिस्टम/पायथन दुभाषिया और कचरा कलेक्टर स्मृति का प्रबंधन कैसे करता है। – Hossein

+5

आप इसका उपयोग करने वाली मेमोरी को कैसे निर्धारित करते हैं? क्या आप वाकई सही हैं? – steabert

उत्तर

0

उत्तर this saga में हो सकता है। मुझे लगता है कि आप कुछ अपरिहार्य स्मृति प्रबंधक ओवरहेड देख रहे हैं।

जैसा कि @ होसेनिन कहते हैं, एक कोड में दोनों कोड स्निपेट निष्पादित करने का प्रयास करें, और फिर उन्हें स्वैप करें।

1

मेरी राय में, शायद यह स्मृति में टुकड़े होंगे। सबसे पहले, मेमोरी भाग जो 255 बाइट्स से बड़े हैं, को सीपीथन में मॉलोक के साथ आवंटित किया जाएगा। आप प्रदर्शन कारण

Improving Python's Memory Allocator

को संदर्भित कर सकते हैं, स्मृति आवंटन के अधिकांश, malloc की तरह, एक गठबंधन का पता वापस आ जाएगी। उदाहरण के लिए, आप कभी नहीं

0x00003 

यह 4 बाइट्स से मेल नहीं किया गया जैसे एक पता मिल जाएगा, यह कंप्यूटर स्मृति का उपयोग करने के लिए बहुत धीमी गति से होगा। इसलिए, मॉलोक द्वारा प्राप्त सभी पते

0x00000 
0x00004 
0x00008 

और इसी तरह से होना चाहिए। 4 बाइट संरेखण केवल मूल आम नियम है, संरेखण की वास्तविक नीति ओएस संस्करण होगी।

और जिस स्मृति उपयोग के बारे में आप बात कर रहे हैं वह आरएसएस (निश्चित नहीं) होना चाहिए। अधिकांश ओएस के लिए, वर्चुअल मेमोरी का पेज आकार 4K है। आपके द्वारा आवंटित किए जाने के लिए, आपको 5000 बाइट खंड को संग्रहीत करने के लिए 2 पृष्ठ की आवश्यकता है। आइए कुछ मेमोरी रिसाव को चित्रित करने के लिए एक उदाहरण देखें। हम मानते हैं कि संरेखण यहां 256 बाइट्स है।

0x00000 { 
...  chunk 1 
0x01388 } 
0x01389 { 
...  fragment 1 
0x013FF } 
0x01400 { 
...  chunk 2 
0x02788 } 
0x02789 { 
...  fragment 2 
0x027FF } 
0x02800 { 
...  chunk 3 
0x03B88 } 
0x03B89 { 
...  fragment 3 
0x04000 } 

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

0

मुझे लगता है कि फ्रीब्स में सभी मेमोरी पते को दो की शक्ति के साथ गठबंधन किया जाना चाहिए।तो सभी पाइथन के मेमोरी पूल कुछ हद तक स्मृति में विभाजित होते हैं और निरंतर नहीं।

कुछ भी दिलचस्प पहचानना कुछ अन्य tool उपयोग करने का प्रयास