2015-05-08 24 views
0

我真的有json數組(〜8GB)的大文件。我需要將它分成一組小文件,每個小文件包含數組的一部分。用JSON數組分割一個真正長的文件

該數組僅包含對象。

我決定實現這個算法:

  • 讀取文件的符號
  • 添加符號來緩衝
  • 嘗試解析緩衝區爲JSON對象。
  • 如果解析寫入對象的文件
  • 當文件達到一定大小,更改文件

我嘗試自己實現它,但像這樣的東西完成:

var fs = require('fs'); 

readable = fs.createReadStream("walmart.dump", { 
    encoding: 'utf8', 
    fd: null, 
}); 
var chunk, buffer = '', counter=0; 
readable.on('readable', function() { 
    readable.read(1); 
    while (null !== (chunk = readable.read(1))) { 
     buffer += chunk; // chunk is one symbol 
     console.log(buffer.length); 
     if (chunk !== '}') continue; 
     try { 
      var res = JSON.parse(buffer); 
      console.log(res); 
      readable.read(1); 
      readable.read(1); 
      readable.read(1); 
      //Array.apply(null, {length: 10}).map(function(){return readable.read(1)}); 
      buffer = '{'; 
     } catch(e) { } 
    } 
}) 

有人解決了類似的問題嗎?

回答

1

單簧管模塊(https://github.com/dscape/clarinet)看起來對我很有希望。它基於sax-js,所以它應該非常強大並經過良好測試。

+0

我試過使用模塊,但是我實現的一些對象真的很大'錯誤:超過最大緩衝區長度:textNode' – kharandziuk

+0

Clarinet公開'MAX_BUFFER_LENGTH'字段設置爲'60 * 1024'。如果遇到最大緩衝區長度超出錯誤,可以爲該字段設置更高的值。 – saintedlama