如何在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
Run Code Online (Sandbox Code Playgroud)
(以上适用于最大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)
Run Code Online (Sandbox Code Playgroud)
--max-stack-size=2147000000--max_executable_size=2000--max_new_space_size=2097152--max_old_space_size=2097152问题是因为 topojson 用于fs.readFileSync读取整个文件。它的作用是打开一个大小(文件长度)的缓冲区,然后填充它。但节点缓冲区的最大大小为字节0x3FFFFFFF或1GB - 1 byte。所以你会得到这个例外。
解决方案?打开 topojson 源并将 readFileSync 替换为流方法,这样不会将整个文件作为一个块读取。或者,如果你感觉真的很黑客,也许用更大的kMaxLength常量重新编译节点......
| 归档时间: |
|
| 查看次数: |
4520 次 |
| 最近记录: |