2012-04-30 26 views
53

Eventuali duplicati:
Is there a memory efficient and fast way to load big json files in python?lettura piuttosto grandi file JSON in Python

così ho alcuni piuttosto grandi file JSON codificato. Il più piccolo è 300 MB, ma questo è di gran lunga il più piccolo. Il resto sono più GB, ovunque da circa 2 GB a 10 GB +.

Quindi mi sembra di esaurire la memoria quando si tenta di caricare il file con Python. Al momento sto facendo alcuni test per vedere quanto tempo ci vorrà per gestire questa roba per vedere dove andare da qui. Ecco il codice che sto usando per prova:

from datetime import datetime 
import json 

print datetime.now() 

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

print datetime.now() 

Non troppo sorprendentemente, Python mi dà un MemoryError. Sembra che json.load() chiami json.loads (f.read()), che sta provando a scaricare prima l'intero file in memoria, il che chiaramente non funzionerà.

Qualsiasi modo per risolvere questo in modo pulito?

So che questo è vecchio, ma non penso che questo sia un duplicato. Mentre la risposta è la stessa, la domanda è diversa. Nel "duplicato", la domanda è come leggere file di grandi dimensioni in modo efficiente, mentre questa domanda riguarda i file che non si adattano nemmeno alla memoria. L'efficienza non è richiesta.

+0

Simile se non la stessa domanda: http://stackoverflow.com/questions/2400643/is-there-a-memory-efficient-and-fast-way-to-load-big-json-files-in- python – tskuzzy

+0

Il problema è che se il file JSON è una lista gigante (per esempio), quindi analizzarlo in Python non avrebbe molto senso senza farlo tutto in una volta. Immagino che la cosa migliore da fare sia trovare un modulo che gestisca JSON come SAX e fornisca eventi per l'avvio di array e roba, piuttosto che fornire oggetti. Sfortunatamente, questo non esiste nella libreria standard. –

+0

Beh, mi piacerebbe leggerlo tutto in una volta. Uno dei miei potenziali piani è quello di esaminarlo una volta e inserire tutto in un database in modo che possa accedervi in ​​modo più efficiente. –

risposta

50

L'opzione migliore sembra utilizzare qualcosa come ijson - un modulo che funzionerà con JSON come flusso, anziché come file di blocco.

Modifica: Vale anche la pena dare un'occhiata - kashif's comment su .

+0

Grazie! Lo controllerò nella speranza che non debba ricorrere all'utilizzo di Java. –

+0

Sì, penso che finirò per usare Java, ma questa è la risposta alla domanda che ho effettivamente posto. Grazie ancora. –

+4

Ho scoperto che ijson richiede un json completo prima di trasmetterlo in streaming: avrei preferito qualcosa che potesse funzionare con json parziale non appena disponibile. Non ho trovato nulla di così scrito il mio, il suo chiamato [jsonstreamer] (https://github.com/kashifrazzaqui/json-streamer) ed è disponibile su [github] (https://github.com/kashifrazzaqui/json- streamer) e al cheeseshop – kashif