2011-06-30 3 views
5
import json 
import time 
from itertools import count 

def keygen(size): 
    for i in count(1): 
     s = str(i) 
     yield '0' * (size - len(s)) + str(s) 

def jsontest(num): 
    keys = keygen(20) 
    kvjson = json.dumps(dict((keys.next(), '0' * 200) for i in range(num))) 
    kvpairs = json.loads(kvjson) 
    del kvpairs # Not required. Just to check if it makes any difference        
    print 'load completed' 

jsontest(500000) 

while 1: 
    time.sleep(1) 

ब्लोट लिनक्स शीर्ष इंगित करता है कि अजगर प्रक्रिया रखती है ~ 450MB। यदि 'पर कॉल json.loads' छोड़ा गया है तो यह समस्या नहीं देखी गई है। gc.collect इस फ़ंक्शन निष्पादन के बाद स्मृति जारी करता है।अजगर json स्मृति 'jsontest' समारोह के समापन के बाद राम की

लग रहा है स्मृति की तरह किसी भी कैश या स्पष्ट कॉल gc.collect को स्मृति को रिहा कर रहा है के रूप में अजगर के आंतरिक स्मृति allocator में आयोजित नहीं है।

यह हो रहा है क्योंकि कचरा संग्रहण के लिए सीमा (700, 10, 10) कभी नहीं पहुँच गया था?

मैंने थ्रेसहोल्ड अनुकरण करने के लिए jsontest के बाद कुछ कोड डाला था। लेकिन यह मदद नहीं की। अपने कार्यक्रम

import gc 
gc.set_debug(gc.DEBUG_STATS) 

के शीर्ष पर

उत्तर

2

रखें इस और आप मुद्रित कर देंगे उत्पादन जब भी एक संग्रह है। आप देखेंगे कि आपके उदाहरण कोड में jsontest पूरा होने तक कोई संग्रह नहीं है, जब तक प्रोग्राम बाहर निकलता है।

आप वर्तमान में गिना जाता है देखने के लिए

print gc.get_count() 

डाल सकते हैं। पहली संख्या पीढ़ी 0 के अंतिम संग्रह के बाद से विधियों पर आवंटन से अधिक है; दूसरा (श्वास तीसरा) पीढ़ी 1 (resp। 2) के अंतिम संग्रह के बाद पीढ़ी 0 (resp। 1) की संख्या एकत्रित की गई है। यदि आप jsontest पूर्ण होने के तुरंत बाद इन्हें प्रिंट करते हैं तो आप देखेंगे कि गणना (548, 6, 0) या कुछ समान है (इसमें कोई संदेह नहीं है कि यह पायथन संस्करण के अनुसार भिन्न होता है)। तो दहलीज तक नहीं पहुंचा और कोई संग्रह नहीं हुआ।

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

+0

भले ही हम कई बार jsontest कहते हैं तो स्मृति ~ 450MB पर रहती है। क्या यह आखिरी jsontest कॉल द्वारा उपयोग की जाने वाली स्मृति है? यह कोड वेबपैप का हिस्सा है जो जेसन संदेशों को संसाधित करता है। एक घंटे के लिए वेबपैप चलाने के बाद भी स्मृति जारी नहीं की जा रही है। क्या gc.collect के अलावा इस के लिए कोई कामकाज है? – Anoop

+1

प्रत्येक कॉल के बाद 'jsontest'' के बाद 'gc.get_count()' प्रिंट करने का प्रयास करें और सभी को स्पष्ट होना चाहिए। साथ ही, 'gc.collect' को कॉल करने में क्या गलत है? –

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