node.js:async.each太慢,大量元素异步处理

时间:2015-01-26 11:23:55

标签: node.js memory-management gridfs

我的系统有4GB的RAM。我需要以下列方式处理一组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个文件并使用它,因为它是一次性活动。但是我想知道在生产中处理这种情况的标准做法是什么?

2 个答案:

答案 0 :(得分:2)

问题归结为并行执行,因为async.each并行执行所有任务,作为解决方法,您可以使用async.eachSeries逐个执行任务,您也可以考虑使用{{ 3}}结合镜头中多个任务的执行。

答案 1 :(得分:0)

您也可以使用async.eachLimitlimit是一次一次异步操作的最大数量。这将抑制异步 并行运行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');
    }
});