2015-08-24 8 views
9

Ho un array json enorme (~ 7 GB) di oggetti relativamente piccoli.Elaborazione di file json-array enormi con jq

C'è un modo relativamente semplice per filtrare questi oggetti senza caricare l'intero file in memoria?

--stream l'opzione sembra adeguata, ma non riesco a capire come piegare il flusso di [percorso, valore] agli oggetti originali.

+0

Piccolo mondo. Mi sono appena imbattuto in un problema simile. Di interesse, gli spazi bianchi nel tuo file JSON sono prevedibili? Ad esempio, gli array JSON di grandi dimensioni utilizzano spesso una riga per elemento di livello superiore dell'array? – Tom

+0

Se il file è già formattato regolarmente, è possibile prendere in considerazione l'utilizzo di strumenti per la creazione di testo per convertire il file in un flusso di piccoli oggetti, che potrebbero quindi essere elaborati utilizzando jq. Se il file non è già adeguatamente formattato, allora se è accettabile usare jq sull'intero file solo una volta, allora potresti prendere in considerazione l'uso di 'jq .' per formattare il JSON per renderlo facile da convertire in un tale stream. – peak

risposta

5

jq 1.5 ha un parser di streaming. Il JQ FAQ fornisce un esempio di come convertire una matrice di primo livello JSON oggetti in un flusso dei suoi elementi:

$ jq -nc --stream 'fromstream(1|truncate_stream(inputs))' 
[{foo:"bar"},{foo:"baz"}] 
{"foo":"bar"} 
{"foo":"baz"} 

che potrebbe essere sufficiente per i vostri scopi, ma vale la pena notare che SetPath/2 può Sii utile. Ecco come produrre un flusso di volantini:

jq -c --stream '. as $in | select(length == 2) | {}|setpath($in[0]; $in[1])' 

Ulteriori informazioni e la documentazione sono disponibili nel manuale JQ: https://stedolan.github.io/jq/manual/#Streaming

+0

L'opzione '--stream' sembra promettente, tuttavia non sono ancora sicuro di come utilizzarlo. Ad esempio, in che modo il parser di streaming rileva una parentesi di chiusura mancante alla fine? – hek2mgl

+0

Grazie, sembra che questo sia il modo per risolvere il mio problema. Purtroppo sembra che jq abbia un [bug] (https://github.com/stedolan/jq/issues/927) che mi impedisce di usarlo. Ho finito per scrivere il proprio parser json che ha fatto lo stesso lavoro. Inoltre ho trovato che il mio semplice script python che greps voci interessanti funziona più velocemente di jq (potrebbe essere che io uso jq in modo improprio). Quindi sono abbastanza deluso in questo strumento :( –

+0

@ dim-an - Il mio male per il fatto che -n sia necessario quando si usano gli input L'opzione --stream è nuova quindi non sono sorpreso che sia piuttosto lento. accennato altrove in questa pagina, se fossi stato nella tua posizione (come in effetti sono stato), probabilmente avrei semplicemente tagliato la prima e l'ultima parentesi, o focalizzato a capire come usare jq una volta per ingannare il tuo gigantesco oggetto JSON in una forma più gestibile: – peak