2014-09-05 17 views
1

我需要讀取node-js中的大型壓縮文件並處理每個文件(大約100MB zip文件,其中包含ca 40.000個XML文件,每個文件500kb未壓縮)。我正在尋找具有可接受速度並且不需要將整個數據集保存在內存中的「流式傳輸」解決方案(JSZip,node-zip爲我工作,但它將所有內容都保存在RAM中,並且性能不夠好)。在c#中的一個快速嘗試表明,在2年前的筆記本電腦上使用DotNetZip約9秒即可實現加載,解包和解析XML。我不希望nodejs速度如此之快,但是一分鐘內的任何事情都沒問題。將文件解包到本地磁盤然後處理它不是一個選項。如何讀取和處理node-js中的大型壓縮文件

我目前正在嘗試使用unzip模塊(https://www.npmjs.org/package/unzip),但不能得到它的工作,所以我不知道如果速度是好的,但至少它看起來像我能流的每個文件,並對其進行處理在回調中。 (問題是我只收到前兩個條目,然後停止調用.on('entry', callback)回調函數,我沒有發現任何錯誤,它只是在2個文件之後靜靜地停下來,也很好地知道我可以如何獲得完整的XML在一個塊,而不是緩衝後取緩衝。)

function openArchive(){ 
     fs.createReadStream('../../testdata/small2.zip') 
     .pipe(unzip.Parse()) 
     .on('entry', function (entry) { 
      var fileName = entry.path; 
      var type = entry.type; // 'Directory' or 'File' 
      var size = entry.size; 
      console.log(fileName); 
      entry.on('data', function(data){ 
       console.log("received data"); 
      }); 
     }); 
    } 

有大量的節點JS模塊與zip文件的工作,所以這個問題是真的要找出哪些庫是最適合這個場景。

+0

- 什麼問題?什麼錯誤?其他人難以排除該一般性陳述。 – bryanmac 2014-09-05 11:13:10

+1

我提到什麼是行不通的。上面的代碼只能從zip中讀取兩個文件。 – shaft 2014-09-05 11:17:55

回答

0

你當你說你「不能得到它的工作」,以()或管道數據呼叫.autodrain另一個流

entry.on('data', function(data) { 
    entry.autodrain(); 
    // or entry.pipe(require('fs').createWriteStream(entry.path)) 
}); 
相關問題