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を、ファイル全体を1つのブロックとして読み取らないストリーミングメソッドに置き換えます。または、本当にハックだと感じている場合は、より大きなkMaxLength定数でノードを再コンパイルしてください...

于 2013-01-10T19:39:20.523 に答える