2012-05-23 44 views
8

Ho un file JSON da 1.7 GB quando sto tentando di aprire con json.load() quindi dà errore di memoria, Come potrebbe leggere il file json in python?Apertura Un file JSON di grandi dimensioni in Python

Il mio file JSON è una grande serie di oggetti contenenti chiavi specifiche.

EDIT: Beh, se è solo una grande serie di oggetti ed è nota la struttura degli oggetti in anticipo, allora non è necessario utilizzare strumenti che potremmo leggerli riga per riga. Una linea conterrà solo un elemento dell'array. Ho notato che è il modo in cui i file JSON sono memorizzati, per me ha funzionato come solo

>>>for line in open('file.json','r').readline(): 
... do something with(line) 
+1

Perché hai un file JSON così grande? Un formato che viene quasi sempre letto nella memoria nel suo insieme è praticamente inadatto a strutture di grandi dimensioni come questa. Prendi in considerazione la possibilità di memorizzare i tuoi dati in un database. – ThiefMaster

+0

Che cosa stai cercando di fare con i dati? Da dove proviene? –

+0

Probabilmente dovrei archiviarli in file diversi ma non farlo :(, voglio usare quei dati per l'analisi dei sentimenti. –

risposta

10

Si desidera un parser JSON incrementale come yajl e uno dei suoi Python. Un parser incrementale legge il meno possibile dall'input e invoca una richiamata quando viene decodificato qualcosa di significativo. Ad esempio, per estrarre solo numeri da un grande file JSON:

class ContentHandler(YajlContentHandler): 
    def yajl_number(self, ctx, val): 
     list_of_numbers.append(float(val)) 

parser = YajlParser(ContentHandler()) 
parser.parse(some_file) 

Vedi http://pykler.github.com/yajl-py/ per maggiori informazioni.

+0

Il mio file json è una grande serie di oggetti che mi aiuta a analizzare? –

+1

@HirakSarkar: si. Dovrai definire callback appropriati nella tua classe ContentHandler. – georg

+0

Ho un problema con il cavo anche dopo aver installato yajl con easy_install nella shell python, si sta dando errore che il modulo yajl non è presente. Cosa dovrei fare. La mia versione python è 2.6 –

1

Ho trovato un altro wrapper python attorno alla libreria yajl, che è ijson.

Funziona meglio per me che yajl-py a causa dei seguenti motivi:

  • yajl-py non ha rilevato biblioteca yajl sul mio sistema, ho dovuto modificare il codice in modo da farlo funzionare
  • codice ijson è più compatto e più facile da usare
  • ijson può funzionare sia con yajl v1 e v2 yajl, e ha persino puro python sostituzione yajl
  • ijson ha molto bello ObjectBuilder, che aiuta l'estrazione di n ot solo eventi ma significativo sotto-oggetti dal flusso analizzato, e al livello specificato
0

ho trovato yajl (da qui ijson) di essere molto più lento rispetto modulo json quando un file di dati di grandi dimensioni è stato accessibile dal disco locale. Qui è un modulo che pretende di svolgere meglio di yajl/ijson (ancora più lento di json), quando viene utilizzato con Cython:

http://pietrobattiston.it/jsaone

Come l'autore fa notare, le prestazioni potrebbero essere migliori di json quando il file è ricevuto in rete poiché un parser incrementale può iniziare l'analisi prima.

Problemi correlati