Node.js:将大量行批量插入数据库

Ste*_*fen 5 database batch-processing node.js

我想批量处理大量记录(> 400k)并将其插入数据库中。

我知道如何使用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');
  });

});
Run Code Online (Sandbox Code Playgroud)

这种方法显然是有缺陷的。它有点用插入查询来锤击数据库,而不必等待单个查询完成。说到使用连接池的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();
Run Code Online (Sandbox Code Playgroud)

尽管此方法对少量数据非常有效(尽管可能很慢,但是没关系。事件循环可以休息一会儿,等待查询完成),但不适用于大型数组-太多的递归。

我可以用任何其他过程语言(例如PHP或类似语言)轻松编写批处理插入,但我不想这样做。我想异步地在nodejs中解决此问题-出于教育目的。

有什么建议么?

Ste*_*fen 4

我找到了一个适合我的解决方案,但我仍然有兴趣了解其技术上的工作原理。

阅读节点异步文档我发现了一些实现此目的的函数:

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!');
});
Run Code Online (Sandbox Code Playgroud)