1

この質問は前回と同じですが、編集を重ねて大きくなりすぎたので、適当にもう一度質問したいと思います。

私はラズベリーパイ(raspbian、512M RAM)に取り組んでおり、node.js(v0.10.2)でjavascriptアプリを実行しています。

その中で、いくつかのビデオをダウンロードする必要があります。これは、次のようにチャンクで行います。

function download (file_url, callback){
    var option={host:url.parse(file_url).host, port:80,path:url.parse(file_url).pathname};
    var file_name=url.parse(file_url).pathname.split('/').pop();
    var file=fs.createWriteStream(DOWNLOAD_DIR+file_name);
    http.get(options, function(res){
        res.on('data', function(data){
            file.write(data);
        }).on('end'), function(){
            file.end();
            callback(DOWNLOAD_DIR+file_name);
        });
    });
};

これは、node.jsを使用して大量のメモリを消費しないように大きなファイルをダウンロードすることに似ていると思います

問題は、ノード プロセスの rss の増加が止まらず、約 100M で開始し、約 400M で OS によって強制終了されることです (これは最大 RAM です)。

私はメモリリークの追跡とブラウザ外でのアプリの実行に慣れていないため、メモリツールを使用できないか、使用方法を理解できません.utilライブラリからrssを取得しました。

私の質問は、データのチャンクをその場で書き込んでいるときでも、RSS が増加し続けるのはなぜですか、および/または解決策を検索する場所ですか?

編集: 上記のリンクをもう一度見ると、createWriteStream でフラグが使用されていることに気付きましたが、それらのリストも効果も見つかりません。そのようなドキュメントにアクセスする方法を知っている人はいますか?関連している可能性があります。

EDIT2:Corlosdpのコードにやみくもに従って、フラグa(追加?)を追加して、ランダムな間隔で2MのRSSをドロップし、アプリを長持ちさせますが、それでも殺されます

EDIT3:興味深いものを発見しました

ダウンロード関数を編集して、ファイルのどこにいるかを確認しました。

function download (file_url, callback){

    var i=0;

    var option={host:url.parse(file_url).host, port:80,path:url.parse(file_url).pathname};
    var file_name=url.parse(file_url).pathname.split('/').pop();

    var file=fs.createWriteStream(DOWNLOAD_DIR+file_name, {flags:'a', encoding:'binary');

    setInterval(function(){
        console.log(i+"o downloaded");
        console.log(util.inspect(process.memoryUsage()));
    },1000);

    http.get(options, function(res){
        res.on('data', function(data){

            i=i+data.length;

            file.write(data);
        }).on('end'), function(){
            file.end();
            callback(DOWNLOAD_DIR+file_name);
        });
    });
};

ログは次のようになりました。

[Downloading the config file]
0o downloaded
0o downloaded
0o downloaded

[logs of the config file getting read, and that the first file start to get downloaded]

986o downloaded
{rss: ...}
6713830o downloaded
{rss:...}
986o downloaded
{rss:...}
14421142o downloaded
{rss: ...}
986o downloaded
{rss:...}
29530702o downloaded
{rss:...}
...

2 つのダウンロードが並行して行われているように見えますが、2 番目のファイルが開始されると (最初のファイル ダウンロードのコールバックで) 奇妙になり続けます。セカンドファイル!

コールバックに到達したときに関数が終了するはずがありませんか?

EDIT5:ばかげて、インターバルをクリアするのを忘れていたので、これを取得しました。

4

1 に答える 1

2

私のコードが動かなかった理由はまだわかりませんが、IRC ユーザーのおかげで、私は置き換えようとしました

res.on('data', function(data){
    ...
});

res.pipe(file);

それは機能し、RAM が 60M を超えないようにします。私は 400M を超えないように苦労していましたが、なぜ彼もそうしないのかわかりませんが、問題は解決しました。

于 2013-09-04T11:02:01.550 に答える