2012-06-18 19 views
11

Non ho mai dovuto farlo prima, quindi questo è probabilmente qualcosa di veramente semplice, ma ho pensato di chiedere comunque.Come leggere file tar.gz molto grandi (> 1GB) in Node.js?

Qual è il modo corretto per leggere un file molto grande in Node.js? Supponiamo che il file sia troppo grande per essere letto tutto in una volta. Dite anche che il file potrebbe essere disponibile in formato .zip o .tar.gz.

Prima domanda, è meglio decomprimere il file prima e salvarlo su disco (Sto usando Stuffit sul Mac per farlo ora), e quindi lavorare con quel file? O puoi leggere lo stream IO direttamente dalla versione compressa .zip o .tar.gz? Immagino che tu abbia bisogno di conoscere il formato del contenuto nel file compresso, quindi probabilmente devi decomprimere (ho appena scoperto che questo file .tar.gz è in realtà un file .dat ...

Quindi il problema principale è, come faccio a leggere questo file di grandi dimensioni in Node.js? Supponiamo che si tratti di un file XML da 1 GB, dove dovrei cercare di iniziare a analizzarlo? (Non, come analizzare XML, ma se stai leggendo il file di grandi dimensioni riga per riga, come analizzi qualcosa come XML che deve conoscere il contesto delle righe precedenti).

Ho visto fs.createReadStream, ma ho paura di scherzare con esso ... non voglio esplodere il mio computer. Sto solo cercando alcuni indicatori nella giusta direzione.

+2

Cosa vuoi fare con questo? –

+0

Che ne dici, supponiamo che sia un CSV molto grande e voglio solo creare un record di database per ogni linea. –

+0

Hai due problemi, 1. Esiste un lettore di file zip in streaming per Node e 2. Esiste un lettore XML in streaming (che può utilizzare il primo stream come input). Non sei sicuro di quali opzioni sono disponibili ma ciò potrebbe aiutarti a cercare ... – Joe

risposta

9

v'è built-in zlib modulo per il flusso di decompressione e sax per flusso XML parsing

var fs = require('fs'); 
var zlib = require('zlib'); 
var sax = require('sax'); 

var saxStream = sax.createStream(); 
// add your xml handlers here 

fs.createReadStream('large.xml.gz').pipe(zlib.createUnzip()).pipe(saxStream); 
+0

Come dovrei andare se voglio comprimere una directory che contiene GB di dati? –

+0

hai bisogno di elaborare immediatamente questo zip o semplicemente vuoi fare zip e salvare? Probabilmente avrei appena generato il comando figlio tar + gz –

+0

Ho solo bisogno di comprimere la directory e salvarla. Sono un po 'nuovo a Node.js, non ho molta familiarità con spawn tar + gz: \ –

1

Possiamo anche comprimere la directory simile al seguente:

var spawn = require('child_process').spawn; 
var pathToArchive = './very_large_folder.tar.gz'; 
var pathToFolder = './very_large_folder'; 

var tar = spawn('tar', ['czf', pathToArchive, pathToFolder]); 
tar.on('exit', function (code) { 
     if (code === 0) { 
       console.log('completed successfully'); 
     } else { 
       console.log('error'); 
     } 
}); 

questo ha funzionato bene :)

Problemi correlati