2012-06-15 18 views
6

Cuando cargo el archivo en json, el uso de la memoria de pitones aumenta a aproximadamente 1,8 GB y parece que no puedo liberar esa memoria. Monté un caso de prueba que es muy simple:¿Gran uso de memoria del módulo json de Python?

with open("test_file.json", 'r') as f: 
    j = json.load(f) 

Lo siento que no puedo proporcionar un archivo JSON muestra, mi archivo de prueba tiene una gran cantidad de información sensible, pero por el contexto, estoy tratando con un archivo del orden de 240MB. Después de ejecutar las 2 líneas anteriores, tengo los 1,8 GB de memoria mencionados anteriormente en uso. Si hago del j, el uso de la memoria no baja en absoluto. Si sigo eso con un gc.collect(), no se cae. Incluso intenté descargar el módulo json y ejecutar otro gc.collect.

Estoy tratando de ejecutar algunos perfiles de memoria, pero Heapy ha estado produciendo CPU al 100% durante aproximadamente una hora y todavía no ha producido ninguna salida.

¿Alguien tiene alguna idea? También he intentado lo anterior usando cjson en lugar del módulo json empaquetado. cjson usó alrededor de un 30% menos de memoria pero mostró exactamente los mismos problemas.

Estoy ejecutando Python 2.7.2 en el servidor de Ubuntu 11.10.

Me complace cargar cualquier generador de perfiles de memoria y ver si funciona mejor que heapy y proporcionar los diagnósticos que pueda considerar necesarios. Estoy buscando un gran archivo JSON de prueba que pueda proporcionar para que cualquier otra persona lo pruebe.

+0

Por favor, pruébalo con otro archivo. ¿Está ejecutando una sesión interactiva o un archivo de script python? ¿Ambos muestran el mismo problema? – heltonbiker

+0

Relacionados: http://stackoverflow.com/questions/2400643/is-there-a-memory-efficient-and-fast-way-to-load-big-json-files-in-python – ChristopheD

+0

@ChristopheD Mi problema es con la memoria nunca siendo lanzada. No me importa tanto que se use mucha memoria durante el análisis. – Endophage

Respuesta

13

creo que estos dos enlaces abordan algunos puntos interesantes sobre este ser no necesariamente un problema de JSON, sino sólo una cuestión de "objeto grande" y cómo la memoria trabaja con Python vs el sistema operativo

Ver Why doesn't Python release the memory when I delete a large object? para la memoria por qué liberado de pitón no se refleja necesariamente por el sistema operativo:

Si crea un objeto grande y eliminar de nuevo, Python, probablemente, ha lanzado la memoria, pero los asignadores de memoria implicadas no necesariamente devolver la memoria a la sistema operativo, por lo que puede parecer que el proceso de Python usa mucha más memoria virtual que en realidad usa.

Sobre running large object processes in a subprocess a permitir que el acuerdo OS con limpieza:

La única manera realmente fiable para asegurar que un uso grande pero temporal de la memoria no devolver todos los recursos al sistema cuando esté hecho, es hacer que ese uso ocurra en un subproceso, que luego termina el trabajo que requiere mucha memoria. Bajo tales condiciones, el sistema operativo HARÁ su trabajo y con mucho gusto reciclará todos los recursos que el subproceso pueda haber engullido. Afortunadamente, el módulo de multiprocesamiento hace que este tipo de operación (que solía ser bastante dolorosa) no sea tan mala en las versiones modernas de Python.

+1

Asegúrese de incluir extractos/ejemplos relevantes para contrarrestar la naturaleza no estable del datum en Internet :) –

+0

@pst: ¡Gracias! Te agradezco que hayas agregado eso. – jdi

+0

Muy frustrante. Parece que su primer fragmento describe la situación con precisión. – Endophage

Cuestiones relacionadas