【发布时间】:2015-03-24 19:25:24
【问题描述】:
我有一个 4GB 内存的系统。我需要按以下方式处理一组 200 个文件(平均文件大小 = 20MB):
- 从 gridfs 读取每个文件
- 从文件中提取一些信息
- 将信息存储到 mongoDB 中的某个集合中
现在的代码是:
async.each(files, function (file, callback){
console.log("reading file", file._id);
readstream[file._id] = db.gfs().createReadStream({
_id: file._id
});
readstream[file._id].on('data', function (chunk) {
part[file._id] = part[file._id] && (part[file._id] + chunk.toString()) || chunk.toString();
});
readstream[file._id].on('end', function(){
// do something here
});
}, function (err){
if(err){
console.error("error ", err);
res.json(err);
}
else{
console.log("saved all files ############ YIPPIEEEEEEEEEEEEE ###################");
res.json({"status": 1});
}
});
它就像 10 个文件的魅力一样。当文件数量很大(在我的情况下为 200 个)时,它会变得非常慢,可能是由于内存限制。
目前,我可以一次处理 10 个文件,并且可以使用它,因为它是一次性活动。但我想知道在生产中处理此类情况的标准做法是什么?
【问题讨论】:
-
这些文件有多大?如果是内存问题,那么最终您需要查看硬件,这里的正确方法是横向扩展而不是纵向扩展。
-
async.each接受所有任务并并行执行它们,尝试使用async.eachSeries而不是一个接一个地执行任务,如果您仍然需要并行执行,您可能想看看async.cargo,它基本上是“each, and eachSeries”的组合。 -
@Ma'moonAl-Akash:async.eachSeries 成功了。谢谢!!! :-) 您可以将其发布为答案,以便我可以关闭此问题
-
我将把这个作为答案发布,以便对其他人有用,请接受它以表明这有助于解决问题。
标签: node.js memory-management gridfs