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!'); });