6

问题

如何在 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)

到目前为止我尝试过的

  • 广泛搜索
  • 命令行内存设置
    • --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
4

1 回答 1

2

问题是因为 topojson 用于fs.readFileSync读取整个文件。这样做是打开一个大小(文件长度)的缓冲区,然后将其填满。但是节点缓冲区具有最大0x3FFFFFFF字节大小,或1GB - 1 byte. 所以你得到了那个例外。

解决方案?打开 topojson 源并将 readFileSync 替换为不会将整个文件作为一个块读取的流方法。或者,如果您感觉非常 hackish,也许可以使用更大的kMaxLength常量重新编译节点...

于 2013-01-10T19:39:20.523 回答