我的系统有4GB的RAM。我需要以下列方式处理一组200个文件(平均文件大小= 20MB):
现在,代码也是如此:
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个文件并使用它,因为它是一次性活动。但是我想知道在生产中处理这种情况的标准做法是什么?
答案 0 :(得分:2)
问题归结为并行执行,因为async.each
并行执行所有任务,作为解决方法,您可以使用async.eachSeries逐个执行任务,您也可以考虑使用{{ 3}}结合镜头中多个任务的执行。
答案 1 :(得分:0)
您也可以使用async.eachLimit。
limit
是一次一次异步操作的最大数量。这将抑制异步
并行运行N个任务。
异步文档:
与每个相同,但是在一个 时间。
示例(未经测试,但是可以一次处理10个文件):
filesContent = []
async.eachLimit(fileNamesArray, 10, function(fileName, callback) {
// Process a file
processFile(fileName, (err, content) => {
filesContent.push(content);
callback(err);
});
}, function(err) {
// if any of tasks produced an error, err would equal that error
if( err ) {
console.log('A file failed to process');
} else {
console.log('All files have been processed successfully');
}
});