Python json memoria bloat

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) 

La parte superior de Linux indica que el proceso de python contiene ~ 450Mb de RAM después de completar la función ‘jsontest’. Si se omite la llamada a ‘ json.loads ‘, no se observa este problema. Un gc.collect después de esta ejecución de la función libera la memoria .

Parece que la memoria no se guarda en ningún caché o el asignador de memoria interna de python, ya que la llamada explícita a gc.collect está liberando memoria.

¿Ocurre esto porque nunca se alcanzó el umbral para la recolección de basura (700, 10, 10)?

Puse algo de código después de jsontest para simular el umbral. Pero no ayudó.

Ponga esto en la parte superior de su progtwig

 import gc gc.set_debug(gc.DEBUG_STATS) 

y obtendrás una salida impresa cada vez que haya una colección. Verá que en su código de ejemplo no hay una colección después de que se complete jsontest , hasta que el progtwig salga.

Puedes poner

 print gc.get_count() 

Para ver los recuentos actuales. El primer número es el exceso de asignaciones sobre desasignaciones desde la última colección de la generación 0; el segundo (resp. tercero) es el número de veces que se ha recostackdo la generación 0 (resp. 1) desde la última recostackción de la generación 1 (resp. 2). Si los imprime inmediatamente después de completar jsontest , verá que los conteos son (548, 6, 0) o algo similar (sin duda esto varía según la versión de Python). Así que no se alcanzó el umbral y no se realizó ninguna recolección.

Este es el comportamiento típico de la progtwigción de recolección de basura basada en umbrales. Si necesita que la memoria libre sea devuelta al sistema operativo de manera oportuna, entonces debe combinar la progtwigción basada en el umbral con la progtwigción basada en el tiempo (es decir, solicitar otra recostackción después de que haya transcurrido cierto tiempo desde la última recostackción). , aunque no se haya alcanzado el umbral).