进程节点增长直到吃掉所有内存

时间:2013-09-04 08:02:08

标签: javascript node.js memory-leaks raspberry-pi raspbian

这个问题与我之前的问题相同,但由于重复编辑它变得太大了,我更愿意再次问它。

我正在使用raspberry pi(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);
        });
    });
};

我相信它与Download large file with node.js avoiding high memory consumption

类似

问题是,节点进程的rs不会停止增加,它开始大约100M,并且在大约400M时被os杀死(这是最大的ram)。

由于我刚接触内存泄漏跟踪并在任何浏览器之外运行应用程序,我要么无法使用或无法理解如何使用内存工具,我从util库中获取了rs。

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

编辑:第二次看上面的链接,我注意到在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常量,第一个不断出现的文件,和第二个文件!

当回调到达时,该函数是否应该结束?

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

1 个答案:

答案 0 :(得分:2)

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

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

通过

res.pipe(file);

它起作用了,并没有超过60M的公羊,而我正努力不超过400M,我不知道为什么他也没有,但问题解决了。