Nodejs:将大量行批量插入到数据库中

我想批量处理大量的logging(> 400k)并将它们插入到数据库中。

我知道如何使用for()或underscore.each()遍历数组,并且我知道如何将一个loggingasynchronous地插入到各个(不)SQL数据库中。 这不是问题 – 问题是我无法想出一个办法在同一时间做两个。

数据库分布本身在这里不起作用,原理适用于任何具有asynchronous接口的(NO)SQL数据库。

我正在寻找一种模式来解决以下问题:

循环方法:

var results = []; //imagine 100k objects here _.each(results,function(row){ var newObj = prepareMyData(row); db.InsertQuery(newObj,function(err,response) { if(!err) console.log('YAY, inserted successfully'); }); }); 

这种做法显然是有缺陷的。 它有点用插入查询锤击数据库,而不用等待一个完成。 谈到使用连接池的MySQL适配器,您很快就会连接失败。

recursion方法:

 var results = []; //again, full of BIGDATA ;) var index = 0; var myRecursion = function() { var row = results[index]; var data = prepareMyData(row); db.InsertQuery(data,function(err, response) { if (!err) { console.log('YAY, inserted successfully!'); index++; //increment for the next recursive call of: if (index < results.length) myRecursion(); } } } myRecursion(); 

虽然这种方法对于小块数据(虽然可能很慢,但没关系,事件循环可以rest一会儿,等待查询完成)工作得很好,但它对大数组无效 – recursion太多。

我可以使用任何其他过程语言(如PHP等)轻松编写批量插入,但我不想。 我想在nodejs中asynchronous地解决这个问题,这是为了教育目的。

有什么build议么?

我发现了一个适用于我的解决scheme,但我仍然对理解这个技术如何工作感兴趣。

阅读节点asynchronous文档,我发现一些function来实现这一点:

async.map //迭代一个数组

async.each //并行迭代一个数组

async.eachSeries //按顺序遍历一个数组

async.eachLimit //用n(限制)并行调用并行迭代数组。

例如:

 var results = []; //still huge array // "4" means, async will fire the iterator function up to 4 times in parallel async.eachLimit(results,4,function(row,cb){ var data = prepareMyData(row); db.InsertQuery(data,function(err, response) { if (!err) { cb(err,response); } } },function(err,res) { console.log('were done!'); });