Javascript Can';不要让mongoose减慢更新速度以防止内存不足

Javascript Can';不要让mongoose减慢更新速度以防止内存不足,javascript,mongodb,mongoose,async.js,Javascript,Mongodb,Mongoose,Async.js,我需要大量上传到我的数据库。我有一个id为的数组,对于每个id,一些代码构建必须发送到数据库的完整数组。如果我只是使用for循环并将其全部发送,我会得到一个致命错误:调用\u并重试\u上次分配失败-进程内存不足。所以我开始想办法解决这个问题。似乎我应该使用async.js更新我的数据库。我非常喜欢async.eachLimit的想法,认为它可以发送10个更新,等待10个回调,然后发送下一个10个等等 我希望这确实是async.eachLimit的工作方式,但我无法让它工作: function c

我需要大量上传到我的数据库。我有一个id为的数组,对于每个id,一些代码构建必须发送到数据库的完整数组。如果我只是使用for循环并将其全部发送,我会得到一个
致命错误:调用\u并重试\u上次分配失败-进程内存不足
。所以我开始想办法解决这个问题。似乎我应该使用async.js更新我的数据库。我非常喜欢async.eachLimit的想法,认为它可以发送10个更新,等待10个回调,然后发送下一个10个等等

我希望这确实是async.eachLimit的工作方式,但我无法让它工作:

function convert() {
    console.log('Converting...');
    var ids = Object.keys(jsonHourly);

    async.eachLimit(ids, 10, function(id, callback){
        console.log('New Subset for ' + id);

        var measurements = someCalculation(id)

        itemCollectionDB.update({'_id': id}, { $set : { graphData : measurements } }, {multi: true}, function(err, numAffected){
            if (err){
                console.log(err)
            }
            console.log('callback for ' + id);
            callback();
        });
    }, function(err){
        if (err){
            console.log(err)
        }
        console.log('A set of 10 has been saved')
    });

    console.log('Done but give the database some time to process it all!')
}
然而,这将产生:

Converting...
New Subset for 24
New Subset for 68
New Subset for 69
New Subset for 70
New Subset for 71
New Subset for 72
New Subset for 73
New Subset for 74
New Subset for 75
New Subset for 76
Done but give the database some time to process it all!
callback for 24
New Subset for 77
callback for 69
New Subset for 78
callback for 68
New Subset for 79
callback for 73
New Subset for 80
callback for 70
New Subset for 81
callback for 75
New Subset for 82
callback for 76
New Subset for 83
callback for 72
New Subset for 84
最后两行对所有id重复。这是怎么回事?我想我会得到10个回调,然后接下来的10个子集被发送


(id包含大约24000个id,我计划在以后工作时增加步长,使其运行得更快)

正在使用哪个版本的
节点
异步。每个限制
不会像您所想的那样以10个为一批完成其工作。它一次强制执行10个未完成的异步更新(这更有效)。在所有更新完成之前,不会调用最终回调。@JohnnyHK那么,当打印“77的新子集”时,它将删除子集24中的所有内容?我的代码实际上运行正常,对吗?它总是会将压力限制在一次10次调用?@SecondLemon是的,您的代码似乎工作得很好。您考虑过使用批量操作吗?和