2012-06-18 57 views
11

我從來沒有這樣做過,所以這可能是一些非常基本的東西,但我想我會問。如何在Node.js中讀取非常大(> 1GB)的tar.gz文件?

什麼是正確的方式來讀取Node.js中的一個非常大的文件?假設文件太大而無法一次全部讀取。也可以說文件可以作爲.zip.tar.gz格式進入。

第一個問題,最好先解壓文件並保存到磁盤(我現在在Mac上使用Stuffit來做這個),然後使用該文件?或者,您是否可以直接從壓縮的.zip.tar.gz版本讀取IO流?我想你需要知道壓縮文件中的內容格式,所以你可能需要解壓縮(剛纔發現這個.tar.gz文件實際上是一個.dat文件)...

然後主要問題是,如何在Node.js中讀取這個大文件?假設它是一個1GB的XML文件,我應該在哪裏開始解析它? (不是,如何解析XML,但是如果您正在逐行閱讀大文件,那麼您如何解析XML等需要了解前面行的上下文的東西)。

我看過fs.createReadStream,但是我怕弄亂它...不想爆炸我的電腦。只是在正確的方向尋找一些指針。

+2

你想用它做什麼? –

+0

怎麼樣,假設它是一個非常大的CSV,我只是想爲每一行創建一個數據庫記錄。 –

+0

您有兩個問題:1.是否有用於節點的流式zip文件閱讀器,以及2.是否有流式XML讀取器(可以使用第一個流作爲輸入)。不知道有哪些選項可以幫助您搜索... – Joe

回答

9

有內置zlib模塊流減壓sax的流XML解析

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

如果我想壓縮包含GB數據的目錄,應該如何處理? –

+0

你需要立即處理該zip文件,或者只是想壓縮並保存?我可能只會產生tar + gz子命令 –

+0

我只需要壓縮目錄並保存。我對Node.js並不陌生,我對spawn tar + gz不是很熟悉:\ –

1

我們還可以壓縮的目錄類似如下:

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

這很好地工作:)

相關問題