2012-08-14 11 views
6

पर वापस नहीं दिया जा रहा है मेरे पास एक बहुत ही सरल स्क्रिप्ट है जो मेमोरी आवंटित करती है, dels एक बड़ी वस्तु का एकमात्र संदर्भ है, जबकि heapy और pidstat रिपोर्ट प्रिंट करते समय। स्क्रिप्ट चलाने के बाद, heapy मुझसे कहता है कि वहाँ ज्यादा मेमोरी प्रयुक्त नहीं किया जा रहा हो, जबकि pidstat मुझे विपरीत बताता है चाहिए:पायथन - स्मृति को कर्नेल

from guppy import hpy 
import time 
import sys 
import os 

''' 
1) print heapy and pidstat report after starting and before actually doing any work 
2) allocate some memory in a simple 2d array 
3) print heapy and pidstat report 
4) del the d2 array (attempt at garbage collection) 
5) print heapy and pidstat report 
6) sleep so pidstat can continue to be run to check on memory 
''' 

def pidstat(msg): 
    print '===============================' 
    print msg 
    os.system('pidstat -r -p %s' % os.getpid()) 
    print '+++++++++++++++++++++++++++++++' 
    print hpy().heap()[0] 
    print '===============================' 

pidstat('before doing anything') 
docs = [] 
for doc in range(0, 10000): 
    docs.append([j for j in range(0, 1000)]) 

pidstat('after fetching all the docs into memory') 
del docs 

pidstat('after freeing the docs') 
time.sleep(60) 

उत्पादन इस प्रकार दिखता है:

 
=============================== 
before doing anything 
Linux 2.6.38-15-generic (hersheezy)  08/14/2012 _x86_64_ (4 CPU) 

01:05:20 PM  PID minflt/s majflt/s  VSZ RSS %MEM Command 
01:05:20 PM  5360  0.44  0.00 44768 9180 0.11 python 
+++++++++++++++++++++++++++++++ 
Partition of a set of 19760 objects. Total size = 1591024 bytes. 
Index Count %  Size % Cumulative % Kind (class/dict of class) 
    0 19760 100 1591024 100 1591024 100 str 
=============================== 
=============================== 
after fetching all the docs into memory 
Linux 2.6.38-15-generic (hersheezy)  08/14/2012 _x86_64_ (4 CPU) 

01:05:21 PM  PID minflt/s majflt/s  VSZ RSS %MEM Command 
01:05:21 PM  5360  8.95  0.00 318656 279120 3.49 python 
+++++++++++++++++++++++++++++++ 
Partition of a set of 7431665 objects. Total size = 178359960 bytes. 
Index Count %  Size % Cumulative % Kind (class/dict of class) 
    0 7431665 100 178359960 100 178359960 100 int 
=============================== 
=============================== 
after freeing the docs 
Linux 2.6.38-15-generic (hersheezy)  08/14/2012 _x86_64_ (4 CPU) 

01:05:29 PM  PID minflt/s majflt/s  VSZ RSS %MEM Command 
01:05:29 PM  5360  40.23  0.00 499984 460480 5.77 python 
+++++++++++++++++++++++++++++++ 
Partition of a set of 19599 objects. Total size = 1582016 bytes. 
Index Count %  Size % Cumulative % Kind (class/dict of class) 
    0 19599 100 1582016 100 1582016 100 str 
=============================== 

मैं यह कैसे सुनिश्चित कर सकते ऑपरेटिंग सिस्टम में मेमोरी वापस आ गई है?

+1

संभावित डुप्लिकेट [डीजेंगो में बड़े प्रश्नों (या प्रश्नों की श्रृंखला) के बाद सिस्टम को स्मृति क्यों जारी नहीं किया जाता है?] (Http://stackoverflow.com/questions/5494178/why-doesnt-memory-get- 2005 में रिलीज-टू-सिस्टम-बड़े-प्रश्न-या-श्रृंखला-के-क्वायर) –

उत्तर

3

python प्रक्रिया के अंदर पुन: उपयोग के लिए स्मृति उपलब्ध होने पर और ओएस को रिलीज़ होने पर एक अंतर हो सकता है। विशेष रूप से, मानक पायथन दुभाषिया (सीपीथन) अपने स्वयं के पूल और विशेष प्रकार के वस्तुओं के लिए मुफ्त सूचियां बनाए रखता है। यह इन पूलों में ही स्मृति का पुन: उपयोग करेगा, लेकिन इसे इस्तेमाल होने के बाद ओएस को कभी भी रिलीज़ नहीं किया जाएगा।

अधिक जानकारी के लिए this देखें।

+1

मुझे विश्वास है कि पोस्ट किए गए प्रश्न का उत्तर दें। मेरे असली प्रश्न लंबे समय से चलने वाले पायथन डिमन से उत्पन्न होते हैं जो प्रति दिन एक बार बहुत कम समय के लिए मेमोरी (सिस्टम की स्मृति का ~ 60%) आवंटित करता है। समाप्त होने के बाद, मेरे संदर्भ को साफ करने के बावजूद स्मृति उपयोग उच्च रहता है। कोई सामान्य सलाह? आपके द्वारा पोस्ट किया गया लिंक यह कहता था कि मुझे बस उस स्थान को पहले स्थान पर आवंटित नहीं करना चाहिए ... – Hersheezy

+0

कोई भी संभावना है कि आप ऐसी चीज कर सकें जिसके लिए दूसरी स्क्रिप्ट में स्मृति की एक टन की आवश्यकता हो, या उस प्रकृति का कुछ? या स्मृति-भूख प्रसंस्करण शुरू होने पर डिमन का दूसरा उदाहरण लॉन्च करें, फिर प्रसंस्करण के बाद छोड़ दें (दूसरे उदाहरण को जारी रखने की अनुमति दें)? – kindall

+2

@Hersheezy: यह उत्तर सराहनीय लगता है लेकिन यह झूठा है। CPython * कभी-कभी स्मृति जारी कर सकते हैं। देखें [मेरी टिप्पणी] (http://stackoverflow.com/questions/11957539/python-memory-not-being-given-back-to- कर्नेल#comment15934886_11957625) – jfs

1

मैं यह कैसे सुनिश्चित कर सकता हूं कि यह मेमोरी ऑपरेटिंग सिस्टम पर वापस आ गई है?

यह आमतौर पर नहीं होगा। पायथन 'एरिना' में स्मृति आवंटित करता है, और यहां तक ​​कि जब दुभाषिया में संदर्भ हटा दिए जाते हैं, तब भी वह उस स्मृति क्षेत्र को बाद में उपयोग करने के लिए रखेगा। मुझे लगता है कि अगर वे पूरी तरह खाली हैं तो एरिना को अनदेखा करने के लिए अजगर के नए संस्करण में एक तंत्र है। लेकिन आपके ऑब्जेक्ट्स को कहां रखा जाता है, इस पर आपका कोई नियंत्रण नहीं है।

+2

[पायथन खाली क्षेत्र छोड़ सकते हैं] (http://bugs.python.org/issue1123430) 2005 में। हालांकि यह हो सकता है [काम करना बंद करो ] (http://bugs.python.org/msg134992) – jfs

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