2016-12-08 10 views
0

私は次のコードで働いている:私はsendToQueueコマンドをコメントアウトした場合、私はそれをコメントしていない場合、それは、私はエラーを取得し、エラーなしで終了しコールバックを強制的に処理するよう強制しますか?

for (var x = 1; x < 10000000; x++) { 
    count++ 
    myObj.name = count 
    ch.sendToQueue(queueName, new Buffer(JSON.stringify(myObj))); 
} 

:FATAL ERROR:CALL_AND_RETRY_LASTの割り当てが失敗しました - プロセスメモリ不足。私はsendToQueueコールをコールバック・キューに追加しているので、これが起こっていると思います。これらはビルド・アップし、メモリが残らなくなるまでメモリを占有します。

コールバックを強制的に実行して、ビルドアップしないようにする方法はありますか?

これはNode/JavaScriptの最適なユースケースではないかもしれないと思いますが、そのような場合は確認が大好きです。

ループを複数の小さなループに分割する方法があると私は理解しています。この特定の使用例では、私はそれを行うことができません。長いループを1回実行する必要があります。

+3

'ch.sendToQueue'とは何ですか?ドキュメントはありますか? – qxz

+0

メッセージキューに追加するためのAMQPです – Ken

+2

'sendToQueue'が何であるか知っていなければなりません。巨大な 'for'ループを実行すると、他のnode.jsコードが' for'ループ(ガベージコレクションを含む)中に実行されることはありません。 'sendToQueue'が何をしているのか、それを助けるために他にどのような処理オプションがあるのか​​を知る必要があります。 – jfriend00

答えて

0

@jfriend00は言うとおり、sendToQueueが延期するとループを終了するまで他のJSコードは実行されません。しかし、ループをチャンクすることはできます。このようなものはうまくいくはずです。

function chunkedLoop(from, to, step, cb) { 
 
    var i = 0; 
 
    for (var i = 0; from < to && i < step; from++, i++) { 
 
    cb(from); 
 
    } 
 
    if (from < to) { 
 
    setTimeout(chunkedLoop.bind(null, from, to, step, cb)); 
 
    } 
 
} 
 

 
chunkedLoop(0, 10, 3, function(i) { console.log(i); });

すべてstep項目、setTimeoutは、他の処理が発生することができ、ループの残りの部分を延期するために実行されます。

+0

これは素晴らしい作品でした!再度、感謝します! – Ken

+0

私はループを十分に大きくすると、queue'dが終了するのを許可するためにタイムアウトをもっと長くする必要があります。どのくらいのものが待ち行列に入っているのかを照会する方法はありますか?それで、次回の実行を開始する前に排水を待つことができますか? – Ken

関連する問題