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 左右时被操作系统杀死(这是最大的 ram)。

由于我是内存泄漏跟踪和在任何浏览器之外运行应用程序的新手,因此我无法使用或无法理解如何使用内存工具,我从 util 库中获取了 rss。

我的问题是:为什么即使我在动态写入数据块和/或在哪里搜索解决方案,RSS 也会不断增加?

编辑:在第二次查看上面的链接时,我注意到在 createWriteStream 上使用了标志,但找不到它们的列表或效果,这里有没有人知道访问此类文档的任何方式,它可能是相关的

EDIT2:我现在盲目地遵循 Corlosdp 的代码,添加标志 a(附加?)使 rss 以随机间隔下降 2M,并使我的应用程序持续更长时间,但它仍然最终被杀死

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:...}
...

似乎有两个并行下载,但是当第二个文件开始时(在第一个文件下载的回调中)它变得越来越陌生,因为现在有三个不同的下载:986常量,第一个文件不断出现,和第二个文件!

到达回调时函数不应该结束吗?

EDIT5:愚蠢的我,我忘了清除间隔,这就是我得到这个的原因。

4

1 回答 1

2

我仍然不知道为什么我的代码不起作用,但是感谢 IRC 用户,我尝试替换

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

经过

res.pipe(file);

它可以工作,并且不要超过 60M 的内存,而我正在努力不要超过 400M,我不知道为什么他也不知道,但问题解决了。

于 2013-09-04T11:02:01.550 回答