2014-01-27 114 views
4

我想在批处理中处理大量记录(> 400k)并将它们插入到数据库中。Nodejs:将大量行批量插入到数据库中

我知道如何用for()或underscore.each()遍历数组,并且我知道如何异步地将一条记录插入到各个(不)SQL数据库中。这不是问题 - 问题是我无法想出一个办法来同时做到这一点。

数据库分布本身在这里不起作用,原理适用于任何带有异步接口的(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适配器,很快就会发生连接不足,脚本失败。

递归方法:

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(); 

虽然这种方法非常有效的小数据块(尽管它可能会很慢,但没关系事件循环可以休息一会,等待查询。完成),它的工作不适合大数组 - 太多的递归。

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

有什么建议吗?

回答

3

我找到了适用于我的解决方案,但我仍然对理解这种技术的工作原理感兴趣。并联

一个数组

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

什么是prepareMyData(行)??? –

+0

您能否提供一个可插入的示例代码? –