2

これにより致命的なエラーが発生するのはなぜですか: JS 割り当てに失敗しました - プロセスがメモリ不足です

arr = []

for (var x=0;x<6000;x++){
    var ys=[];
    arr.push(ys);
    for (var y=0;y<6000;y++){
        var tile = [0,1,2];
        ys.push(tile);
    }
}

私の見方では、108000000 int、つまり 432 MB しかなく、1.4 GB の制限からはかけ離れています。

4

1 に答える 1

5

あなたが数えていないもの:

  • 配列オブジェクトのオーバーヘッド
  • オブジェクト参照のサイズ
  • プログラムが行っているその他のこと
  • Node.js メモリ自体

オブジェクト参照が 64 ビット (サイズがわからない...) であると仮定すると、3600 万の参照 * 4 バイト = 144 メガバイトになります。

配列のオーバーヘッドをカウントする前に、最大 576 MB です。

また、配列はサイズ変更可能であるため、割り当てられた長さがサイズに正確に基づいているのか、それともランタイムが念のために余分なメモリを割り当てるのかはわかりません。

思い出すと、Java の ArrayList を展開すると、実際には 2 倍になります。

JavaScript で配列がどのように実装されているか正確にはわかりませんが、array.length の読み取りが一定時間であることを考えると、各配列にはおそらく事前に計算された長さのプロパティがあります。

3,600 万の配列があるため、さらに 144 メガバイトあります。

これまでのところ 720 MB です。

これらの配列が ArrayList のように二重に割り当てられていないことを願っています。

于 2013-04-28T21:08:33.360 に答える