进程节点不断增长,直到吃完所有内存

这个问题和我以前的问题是一样的,但是由于反复编辑变得太大了,我更喜欢再问一遍。

我正在研究覆盆子pi(raspbian,512M RAM),并在node.js(v0.10.2)中做一个JavaScript应用程序。

在这里,我需要下载一些video,至于我这样做的块:

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所杀死。

由于我新内存泄漏跟踪和运行应用程序以外的任何浏览器,我要么不能使用或不能理解如何使用内存工具,我已经从util库中获取rss。

我的问题是:为什么rss不断增加,甚至当我在飞行中写入大量数据,和/或在哪里寻找解决scheme?

编辑:第二次看看上面的链接,我注意到使用createWriteStream上的标志,但无法find它们的列表或效果,是否有任何人在这里谁知道任何方式来访问这样的文档,它可能是相关的

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

编辑3:我发现了一些有趣的东西

我编辑了下载function,看看我在文件中的位置:

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

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

当callback达到时,该function是否应该结束?

编辑5:傻我,我忘了清除间隔,这是为什么我得到这个。

我仍然不知道为什么我的代码没有工作,但感谢一个IRC用户,我试图更换

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

通过

 res.pipe(file); 

它的工作,不要超过60M的公羊,而我正在努力不超过400M,我不知道为什么他不是,但问题解决了。