2012-06-18 18 views
11

Bunu daha önce hiç yapmak zorunda değildim, bu yüzden muhtemelen çok basit bir şey, ama yine de sormam gerektiğini düşündüm.Node.js'de çok büyük (> 1GB) tar.gz dosyaları nasıl okunur?

Çok büyük bir dosyayı Node.js'de okumak için doğru yol nedir? Dosyanın tek seferde okumak için çok büyük olduğunu söyle. Ayrıca, dosyanın .zip veya .tar.gz biçiminde de gelebileceğini varsayalım.

İlk soru, önce dosyayı sıkıştırmak ve diske kaydetmek en iyisidir (bunu yapmak için Mac'te Stuffit kullanıyorum) ve sonra bu dosya ile çalışın mı? Veya IO akışını sıkıştırılmış .zip veya .tar.gz sürümünden doğrudan okuyabiliyor musunuz? Ben,

Ardından ana konudur ... herhalde (sadece bu .tar.gz dosya aslında bir .dat dosyasıdır öğrendim) sıkıştırmasını zorunda böylece, sıkıştırılmış bir dosyada içeriğin biçimini bilmemiz gerekir diye tahmin Bu büyük dosyayı Node.js'de nasıl okuyabilirim? 1GB XML dosyası olduğunu söyle, ayrıştırmaya başlamak için nereye bakmalıyım? (Değil, XML'yi nasıl ayrıştırılacağını, ancak büyük dosya satırını okuyorsanız, önceki satırların içeriğini bilmesi gereken XML gibi bir şeyi nasıl ayrıştırırsınız).

fs.createReadStream'u gördüm, ancak bununla uğraşmaktan korkuyorum ... bilgisayarımı patlatmak istemiyorum. Sadece doğru yönde bazı işaretçiler arıyorum.

+2

Onunla ne yapmak istersiniz? –

+0

Çok büyük bir CSV olduğunu varsayalım ve sadece her satır için bir veritabanı kaydı oluşturmak istiyorum. –

+0

İki sorununuz var, 1. Düğüm için bir akışlı zip dosyası okuyucusu var mı ve 2. Akan bir XML okuyucu var mı (giriş olarak ilk akışı kullanabilir). Hangi seçeneklerin orada olduğundan emin olmanıza rağmen arama yapmanıza yardımcı olabilir ... – Joe

cevap

9

orada yerleşik olan

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

Veri GB'lerini içeren bir dizini ziplemek istiyorsam nasıl devam etmeliyim? –

+0

Bu zip'i hemen işlemek mi gerekiyor yoksa sadece zip & save yapmak mı istiyorsunuz? Muhtemelen tar + gz çocuk komutanı –

+0

'u doğururdum sadece dizini ziplemeye ve kaydetmem gerek. Ben Node.js için biraz yeniyim, spawn tar + gz: \ –

1

Ayrıca şu gibi dizin şey zip olabilir ayrıştırma zlib akışı dekompresyon için modül ve akarsu XML için sax:

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

Bu güzel çalıştı :)

İlgili konular