node.js / v8将大文件读入内存

如何在node.js下读取大于1.1 GB的文件到内存中?

我试图在node.js下使用topojson将> 1.1 GB的GeoJSON文件转换为TopoJSON格式。

$ topojson -o outfile.json larger_than_one_point_one_GB_input_file.json 

(以上已经为文件高达517 MB)

结果如下错误

 buffer.js:242 this.parent = new SlowBuffer(this.length); ^ RangeError: length > kMaxLength at new Buffer (buffer.js:242:21) at Object.fs.readFileSync (fs.js:200:14) at /usr/local/share/npm/lib/node_modules/topojson/bin/topojson:61:26 at Array.forEach (native) at Object.<anonymous> (/usr/local/share/npm/lib/node_modules/topojson/bin/topojson:60:8) at Module._compile (module.js:449:26) at Object.Module._extensions..js (module.js:467:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.runMain (module.js:492:10) 

我迄今为止所尝试的

  • 广泛的search
  • 命令行内存设置
    • --max-stack-size=2147000000
    • --max_executable_size=2000
    • --max_new_space_size=2097152
    • --max_old_space_size=2097152
  • 自定义编译最新的v8版本到自定义node.js安装
    • 他们似乎已经消除了这个内存限制(如果我是正确的,我可能不会)
    • 这并不成功

版本

  • node.js:v0.8.15
  • v8:3.11.10.25

问题是因为topojson使用fs.readFileSync来读取整个文件。 这是打开一个大小的缓冲区(文件的长度),然后填写它。 但节点缓冲区的最大大小为0x3FFFFFFF个字节,或1GB - 1 byte 。 所以你得到这个例外。

解? 打开topojson源文件并用不会将整个文件作为一个块读取的stream式方法replacereadFileSync。 或者如果你感觉真的很黑,也许用更大的kMaxLength常量重新编译节点…