今日、私は奇妙な問題に出会いました。これは他の人にとっては簡単な答えかもしれませんが、私は困惑しています。以下のコードがメモリエラーを引き起こすのはなぜですか?
var cur = 167772160;
var bcast = 184549375;
var addresses = [];
while (cur <= bcast){
cur += 1;
addresses.Push(cur);
}
addresses.length
addresses // memory goes from a few megs to over a gig in seconds when trying to print this
私はこれらの2つのエラーの1つを受け取ります...最初にノードのインタープリターでこのコードを実行すると、後者はnodeunitで実行すると:
致命的なエラー:CALL_AND_RETRY_2の割り当てに失敗しました-プロセスがメモリ不足です
致命的なエラー:JSの割り当てに失敗しました-プロセスがメモリ不足です
アレイにアクセスしようとすると発生します。しかし、長さを取得することはできません。
> var cur = 167772160;
> var bcast = 184549375;
> var addresses = [];
> while (cur <= bcast){
... cur += 1;
... addresses.Push(cur);
... }
16777216
> addresses.length
16777216
> addresses
FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
ここに別のSO質問、 Node.jsのメモリ制限(およびchrome V8) メモリ使用量の問題に関連しています。
MB単位の--max-old-space-size=<value>
を渡すことで、デフォルトの制限を増やすことができます。
この例では、ノードのヒープで最大4GB(4096 メガバイト)のメモリを使用できます。
node --max-old-space-size=4096 app
スクリプトを実行してもメモリ割り当てエラーは発生しません。あなたのシステムにはどれくらいのRAMがありますか?
編集 Ok著者の更新されたメモで、複製できます。
ノードは配列全体を文字列に変換しようとしています。配列の長さは16777216要素です。各要素には、少なくとも9桁の数字が含まれています。それを150,994,994文字の文字列に変換します。ノードのメモリ容量を超えている巨大な操作です。