2015-05-08 22 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