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)
के शीर्ष पर
भले ही हम कई बार jsontest कहते हैं तो स्मृति ~ 450MB पर रहती है। क्या यह आखिरी jsontest कॉल द्वारा उपयोग की जाने वाली स्मृति है? यह कोड वेबपैप का हिस्सा है जो जेसन संदेशों को संसाधित करता है। एक घंटे के लिए वेबपैप चलाने के बाद भी स्मृति जारी नहीं की जा रही है। क्या gc.collect के अलावा इस के लिए कोई कामकाज है? – Anoop
प्रत्येक कॉल के बाद 'jsontest'' के बाद 'gc.get_count()' प्रिंट करने का प्रयास करें और सभी को स्पष्ट होना चाहिए। साथ ही, 'gc.collect' को कॉल करने में क्या गलत है? –