Node.jsでは文字列型の変数に268.44MBを超える値を入れることは出来ない

V8エンジンの仕様らしい




不具合が確認できるコード(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を使うしかないか

2017年11月18日土曜日