2012-04-30 20 views
53

Duplicar posible:
Is there a memory efficient and fast way to load big json files in python?lectura bastante grandes archivos JSON en Python

Así que tienen algunas bastante grandes archivos JSON codificado. El más pequeño es de 300 MB, pero este es con mucho el más pequeño. El resto son GB múltiples, desde alrededor de 2GB a 10GB +.

Me parece que me quedo sin memoria cuando intento cargar el archivo con Python. Actualmente estoy realizando algunas pruebas para ver aproximadamente cuánto tiempo tendremos que lidiar con estas cosas para ver a dónde ir desde aquí. Aquí está el código que estoy usando para la prueba:

from datetime import datetime 
import json 

print datetime.now() 

f = open('file.json', 'r') 
json.load(f) 
f.close() 

print datetime.now() 

No es demasiado sorprendente, Python me da un MemoryError. Parece que json.load() llama a json.loads (f.read()), que está tratando de volcar todo el archivo en la memoria primero, lo que claramente no va a funcionar.

¿De alguna manera puedo resolver esto limpiamente?

Sé que esto es viejo, pero no creo que sea un duplicado. Si bien la respuesta es la misma, la pregunta es diferente. En el "duplicado", la pregunta es cómo leer archivos de gran tamaño de manera eficiente, mientras que esta pregunta trata de archivos que ni siquiera caben en la memoria. Eficiencia no es requerida

+0

Similar si no es la misma pregunta: http://stackoverflow.com/questions/2400643/is-there-a-memory-efficient-and-fast-way-to-load-big-json-files-in- python – tskuzzy

+0

El problema es que si el archivo JSON es una lista gigante (por ejemplo), entonces analizarlo en Python no tendría mucho sentido sin hacerlo todo de una vez. Supongo que su mejor opción es encontrar un módulo que maneje JSON como SAX y le proporcione eventos para iniciar arreglos y cosas, en lugar de darle objetos. Desafortunadamente, eso no existe en la biblioteca estándar. –

+0

Bueno, como que quiero leerlo de una vez. Uno de mis planes potenciales es atravesarlo una vez y pegar todo en una base de datos para que pueda acceder a él de manera más eficiente. –

Respuesta

50

La mejor opción parece ser utilizar algo como ijson, un módulo que funcionará con JSON como una secuencia, en lugar de como un archivo de bloque.

Editar: También vale la pena mirar - kashif's comment sobre .

+0

Gracias! Lo verificaré con la esperanza de que no tenga que recurrir al uso de Java. –

+0

Sí, creo que terminaré usando Java, pero esta es la respuesta a la pregunta que realmente hice. Gracias de nuevo. –

+4

Descubrí que ijson requiere un json completo antes de que se transmita - Hubiera preferido algo que pueda funcionar con json parcial a medida que esté disponible. No pude encontrar nada, así que escribí el mío, se llama [jsonstreamer] (https://github.com/kashifrazzaqui/json-streamer) y está disponible en [github] (https://github.com/kashifrazzaqui/json- streamer) y en la tienda de quesos – kashif

Cuestiones relacionadas