不具合が確認できるコード(RangeError: Invalid string length)
以下のコードで確認してみる。
環境は
Mac Sierra
Node v6.x
let text = "x" while (true) { text += text console.log(x.length) }
以下のように表示される
2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 x = "" + x + x; ^ RangeError: Invalid string length at Object.(/Users/xxxxxxx:7:16) at Module._compile (module.js:570:32) at Object.Module._extensions..js (module.js:579:10) at Module.load (module.js:487:32) at tryModuleLoad (module.js:446:12) at Function.Module._load (module.js:438:3) at Module.runMain (module.js:604:10) at run (bootstrap_node.js:383:7) at startup (bootstrap_node.js:149:9) at bootstrap_node.js:496:3 aaaa
原因
以下の中央少し下より
https://github.com/atom/atom/issues/7210
v8のStringBuilderが文字列の長さの変数part_length_にint型を採用しており、ポインタやらなんやらで下記のサイズまでしか使えないとのこと。
(1 << 28) - 16
268435440 バイト
該当箇所、場所は変わるかも
https://github.com/v8/v8/blob/master/src/string-builder.h#L437
ファイルなどで超えてしまう場合はStreamを使うしかないか