2011-09-09 12 views
28

今日私は好奇心をそそる問題に遭遇しました。これは他の人にとっては簡単な答えかもしれませんが、私には困惑しています。なぜ以下のコードでメモリエラーが発生するのですか?アウトプロセス - CALL_AND_RETRY_2の割り当てに失敗しました:nodejs of memory

FATAL ERROR:私は、ノードのインタプリタと後者でこのコードを実行すると、私はnodeunitを通してそれを実行したときに、私はこれらの2つのエラーの1 ...最初の取得

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 

メモリ

致命的なエラーが発生した:JSの割り当てに失敗しました - プロセスをメモリ

+0

、私はバッファを使用してに切り替えました。制限付きの成功。http://stackoverflow.com/questions/7379755/buffer-size-in-nodejs –

答えて

7

アレイにアクセスしようとすると起こります。 しかし、長さを得ることはありません。

> 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 

もう1つのSOの質問memory limit in Node.js (and chrome V8)がメモリ使用に関する問題に関連しています。

+1

それで1つ。これをnodejs github issueリストに投げ捨ててください。 –

+0

ええ、私はそれほど以前の質問を見ましたが、もうノードだとは思いません。私はGoogle Chromeをクラッシュさせ、そのコードを実行することができます。一息。 –

+0

ああ、google chromeもnode.jsで使用されているのと同じv8エンジンを使用しています16,777,216の9桁の整数を格納するのと同じように、実際には多くのメモリが必要です。 – ace

4

のうち、私はあなたのスクリプトを実行するとき、私はメモリ割り当てエラーを得ることはありません。あなたのシステムにはどれくらいのRAMがありますか?

著者の最新のメモで確認できます。私はそれを複製できます。

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

+0

4 GB、macbook air。 address.lengthプロパティに必ずアクセスしてください。それは私がクラッシュする場所です。私はそれを追加します。私はその部分に言及するのを忘れた。 lol –

+0

設定にも問題はありません。それは 'addresses.length'でしょうか? – ace

+0

打ち間違え。私はアクティビティモニタを見ただけです。 "アドレス"とタイプして配列をプリントアウトしようとすると、ノードのメモリ使用量はほとんど何もなく、わずか数秒でギグになり、その後死にます。 :(悲しみ) –

21

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

の例では、ノードのヒープが4GBのメモリ(4096 メガバイト)まで使用できるようになります。興味のある人のための

node --max-old-space-size=4096 app 
+4

4GBは実際には4096ですが、回答を編集しようとしましたが、変更は6文字以下です。 – Ido