Sto eseguendo un cron job sulla mia istanza micro Amazon EC2 ogni 12 ore. Scarica il file 118MB e lo analizza usando la libreria json. Questo ovviamente rende l'istanza a corto di memoria. La mia istanza ha 416 MB di memoria libera, ma poi eseguo lo script che scende a 6 MB e poi viene ucciso dal sistema operativo.Modo efficiente di analizzare 100 MB di carico utile JSON
Mi chiedo quali sono le mie opzioni qui? È possibile analizzare questo in modo efficiente tramite Ruby o devo scendere a roba di basso livello come C? Posso ottenere un'istanza Amazon più capace ma voglio davvero sapere se è possibile farlo tramite Ruby.
UPDATE: Ho visto yajl. Può darti oggetti json mentre analizza, ma il problema è che se il tuo file JSON contiene solo 1 oggetto root, allora sarà costretto ad analizzare TUTTO il file. Il mio JSON è simile al seguente:
--Root
-Obj 1
-Obj 2
-Obj 3
Quindi, se faccio:
parser.parse(file) do |hash|
#do something here
end
Dal momento che ho solo 1 oggetto radice, si analizzerà l'intero JSON. Se Obj 1/2/3 fosse root, funzionerebbe come mi verrà dato uno per uno, ma il mio JSON non è così e analizza e mangia 500mb di memoria ...
AGGIORNAMENTO # 2: Ecco una versione più piccola del file 118mb di grandi dimensioni (7MB):
GONE
E 'da interpretare, non mi basta prendere un po' di byte fuori dal file, solo così si un vede come un'intera. La matrice che sto cercando è questo
events = json['resultsPage']['results']['event']
Grazie
è possibile dividere il download in 6 o più segmenti e poi mettere di nuovo insieme? –
100 MB di testo JSON? Cosa stai memorizzando? La biblioteca di Alessandria? ': P' –
Perché stai usando JSON per questo? Non sembra il formato giusto per il lavoro. Qualcosa di più orientato alla registrazione (anche CSV) sarebbe una corrispondenza migliore. Se non riesci a controllare il formato, forse puoi rimuovere manualmente l'oggetto radice per forzare il formato in JSON orientato alla registrazione. –