2012-06-18 29 views
11

Nunca he tenido que hacer esto antes, así que esto es probablemente algo realmente básico, pero pensé en preguntar de todos modos.Cómo leer archivos tar.gz muy grandes (> 1GB) en Node.js?

¿Cuál es la forma correcta de leer un archivo muy grande en Node.js? Supongamos que el archivo es demasiado grande para leerlo todo de una vez. También diga que el archivo podría venir en formato .zip o .tar.gz.

Primera pregunta, ¿es mejor descomprimir primero el archivo y guardarlo en el disco (estoy usando Stuffit en la Mac para hacer esto ahora), y luego trabajar con ese archivo? ¿O puede leer el flujo de IO directamente desde la versión comprimida .zip o .tar.gz? Supongo que necesitarás saber el formato del contenido en el archivo comprimido, por lo que probablemente tengas que descomprimir (descubrí que el archivo .tar.gz es en realidad un archivo .dat) ...

Luego, el problema principal es: ¿Cómo leo este archivo grande en Node.js? Digamos que es un archivo XML de 1GB, ¿dónde debo mirar para comenzar a analizarlo? (No, cómo analizar XML, pero si está leyendo el archivo grande línea por línea, ¿cómo analiza algo como XML que necesita conocer el contexto de las líneas anteriores).

He visto fs.createReadStream, pero tengo miedo de perder el tiempo con eso ... no quiero explotar mi computadora. Solo buscando algunos indicadores en la dirección correcta.

+2

¿Qué quieres hacer con él? –

+0

Qué tal, supongamos que es un CSV muy grande y solo quiero crear un registro de base de datos para cada línea. –

+0

Tiene dos problemas, 1. ¿Hay un lector de archivos zip en tiempo real para Node, y 2. Hay un lector de flujo XML (que puede usar la primera transmisión como entrada). No estoy seguro de qué opciones hay pero que podrían ayudarlo a buscar ... – Joe

Respuesta

9

no está incorporado zlib módulo para la descompresión arroyo y sax para XML corriente de análisis

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

¿Qué debo hacer si quiero comprimir un directorio que contiene GB de datos? –

+0

¿Necesita procesar ese zip inmediatamente o solo quiere comprimir y guardar? Probablemente solo generaría el comando tar + gz child –

+0

Solo necesito comprimir el directorio y guardarlo. No estoy muy familiarizado con Node.js, no estoy familiarizado con spawn tar + gz: \ –

1

También puede comprimir el directorio de algo como lo siguiente:

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'); 
     } 
}); 

Esto funcionó muy bien :)

Cuestiones relacionadas