4

私はデーモン (具体的には Heroku のワーカー プロセス) を設計しており、コードは RAM の使用量に徐々に蓄積されています。少量 (100kb/10 秒) ですが、このプロセスを長期間使用するには、RAM の使用量を一定に保つことが最善であることを知っています。私は長時間実行するように設計されたプロセスを作成するのは初めてで、Node と Javascript でアプリケーションを開発するのはまだかなり新しいです。ここに私のコードのほとんどがあります:

////////////////
// Queue Loop //
////////////////
var worker = (function() {
var buffer = "";
var couchdb = http.get({
    auth: db_user + ":" + db_pass,
    host: db_host, 
    path: '/queue/_all_docs?include_docs=true',
    port: db_port
}, function( response ) {
    response.setEncoding('utf8');

    response.on("data", function( data ) {
        buffer += data;
    });

    response.on("end", function() {         
        var queue = JSON.parse(buffer);

        if ( !queue.error ) {

            buffer = "";
            couchdb = http.get({
                auth: db_user + ":" + db_pass,
                host: db_host,
                path: '/flights/_all_docs?include_docs=true',
                port: db_port
            }, function( response ) {
                response.setEncoding('utf8');

                response.on("data", function(data) {
                    buffer += data;
                });

                response.on("end", function() {
                    var flights = JSON.parse(buffer);

                    if ( !flights.error ) {
                        for ( row in queue.rows ) {
                            console.log(queue.rows[row].doc.flight);
                        }

            for ( row in flights.rows ) {
                console.log(flights.rows[row].doc.program);
                }

                setTimeout( worker, 10000 );    
            } else {
                // db error
            }
            });
        }).on("error", function() {
            setTimeout( worker, 10000 );    
        });
            } else {
                // db error
            }
        });
    }).on("error", function() {
        console.error("CouchDB is currently not available.");
        setTimeout( worker, 10000 );
    });
});



///////////////
// Run Queue //
///////////////
(function() {
    worker();
})();

それで、このようなプログラムを同じ量のRAMで常に実行し続けるための最良の方法は何ですか? Heroku でワーカー プロセスとして機能するのに十分なパフォーマンスを維持するには、他にどのような設計上の考慮事項が不可欠ですか?

ああ、それが何をするかというと、CouchDB インスタンスからいくつかのエントリを取り出し、それらのエントリに基づいて予測を実行します。

4

1 に答える 1

3

Node.js はprocess.nextTick()、コール スタックをクリアするという便利な関数を提供していることがわかりました (編集: これは当てはまらないかもしれませんが、蓄積を防ぐのに役立ちます)。ワーカーへのすべての呼び出しをラップすることで、理論上のスタック オーバーフローを防ぐことができました (実際には発生していませんでしたが、メモリ使用量は増え続けていました)。

この機能についての私の理解はそれほど深くはありませんが、私がずっとやりたかったことを実行してくれます。

(編集:ノードにはV8を介した素晴らしいガベージコレクションがあることが判明しましたが、奇妙な間隔で実行されます!)

読む:

于 2012-07-12T02:33:45.927 に答える