0

Nodeで非同期ループを使用するプログラムを書いています。目標は、このプログラムを Heroku で長期間実行できるようにすることです。予想どおり、メモリ内で成長します。しかし、メモリ使用量が約 57MiB に達すると、22MiB (開始時) に戻ります。メモリ使用量がどこからともなく落ちる原因は何ですか?

これが私のコードです。database.readを単純化しただけですhttp.request

var http = require("http");
var util = require('util');

var fnstraj = require("./predictors/fnstraj.js");
var database = require("./library/database.js");

var COUNT = 0;



////////////////
// Queue Loop //
////////////////
var worker = function() { 
    setTimeout(function() {
        COUNT++;

        console.log("Worker Clock: " + COUNT + ".");
        console.log(util.inspect(process.memoryUsage()));

        database.read('/queue/', function( results, error ) {
            if ( typeof error !== "undefined" && error ) {
                process.nextTick( worker );
            } else {
                var queue = results;

                database.read('/flights/', function ( results, error ) {
                    if ( typeof error !== "undefined" && error ) {
                        process.nextTick( worker );
                    } else {
                        var flights = results;

                        if ( !flights.error && typeof queue.rows[0] !== "undefined" ) {             
                            for ( flight in flights.rows ) {
                                if ( flights.rows[flight].doc._id === queue.rows[0].doc._id ) {     
                                    var thisFlight = flights.rows[flight].doc;

                                    console.log("Flight " + thisFlight._id + " started");

                                    thisFlight.duration = fnstraj.vertPred(thisFlight.launch.altitude, thisFlight.balloon.burst, thisFlight.balloon.radius, thisFlight.balloon.lift);

                                    fnstraj.predict(thisFlight, function() {
                                        database.remove('/queue/' + thisFlight._id);

                                        console.log("Flight " + thisFlight._id + " completed");

                                        process.nextTick( worker );
                                    });

                                    var found = true;
                                }
                            }

                            if ( !found ) {
                                process.nextTick( worker );
                            }
                        }
                    }
                });
            }
        });
    }, 25);
};
4

1 に答える 1

1

これは、V8 ガベージ コレクションに関連しています。ノードの「--gc_interval」オプションで微調整できますが、これは高度なパラメーターであることに注意してください。

node --gc_interval <allocation count interval>

これは、GC のヒープ圧縮にも関連している可能性があります。これは、以前に解放されたすべてのスペースを収集し、最終的にオペレーティング システムに戻すプロセスです。

さらに微調整するには、V8 固有のオプションを試すことができます。

node --v8-options
于 2012-07-13T14:56:45.557 に答える