这个问题和我上一个问题一样,但是由于重复编辑变得太大,我更愿意再适当地问一遍。
我正在研究树莓派(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:愚蠢的我,我忘了清除间隔,这就是我得到这个的原因。