web-dev-qa-db-ja.com

nodejsのメモリ不足

今日、私は奇妙な問題に出会いました。これは他の人にとっては簡単な答えかもしれませんが、私は困惑しています。以下のコードがメモリエラーを引き起こすのはなぜですか?

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の割り当てに失敗しました-プロセスがメモリ不足です

29
Sneaky Wombat

アレイにアクセスしようとすると発生します。しかし、長さを取得することはできません。

> 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) メモリ使用量の問題に関連しています。

7
ace

MB単位の--max-old-space-size=<value>を渡すことで、デフォルトの制限を増やすことができます。

この例では、ノードのヒープで最大4GB(4096 メガバイト)のメモリを使用できます。

node --max-old-space-size=4096 app
24
Saheed

スクリプトを実行してもメモリ割り当てエラーは発生しません。あなたのシステムにはどれくらいのRAMがありますか?

編集 Ok著者の更新されたメモで、複製できます。

ノードは配列全体を文字列に変換しようとしています。配列の長さは16777216要素です。各要素には、少なくとも9桁の数字が含まれています。それを150,994,994文字の文字列に変換します。ノードのメモリ容量を超えている巨大な操作です。

4
Geuis