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)
Linux top wskazuje, że proces Python posiada ~ 450MB RAM po zakończeniu 'jsontest' funkcji. Jeśli połączenie z "json.loads" zostanie pominięte, problem nie zostanie zauważony. A gc.collect po wykonaniu tej funkcji zwalnia pamięć.Python json pamięć uwędzić
Wygląda na to, że pamięć nie jest przechowywana w żadnych pamięciach podręcznych lub wewnętrznym alokatorze pamięci Pythona, ponieważ jawne wywołanie gc.collect zwalnia pamięć.
Czy tak się dzieje, ponieważ próg do zbierania śmieci (700, 10, 10) nigdy nie został osiągnięty?
Wprowadziłem kod po jsontest, aby symulować próg. Ale to nie pomogło.
Nawet jeśli wielokrotnie wywoływamy jsontest, pamięć pozostaje na ~ 450MB. Czy to jest pamięć używana przez ostatnie wywołanie jsontest? Ten kod jest częścią webapp, który przetwarza wiadomości json. Nawet po uruchomieniu aplikacji internetowej przez godzinę pamięć nie wydaje się być zwolniona. Czy istnieje obejście tego innego rozwiązania niż gc.collect? – Anoop
Spróbuj wydrukować 'gc.get_count()' po każdym wywołaniu 'jsontest', a wszystkie powinny być jasne. Co jest złego w wywołaniu 'gc.collect'? –