首页 文章

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

提问于
浏览
4

我想批量处理大量记录(> 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');
  });

});

这种方法显然存在缺陷 . 它有点使用插入查询来锤击数据库,而无需等待单个数据库完成 . 说到使用连接池的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中异步解决这个问题 - 出于教育目的 .

有什么建议?

1 回答

  • 3

    我找到了一个适合我的解决方案,但我仍然有兴趣了解这在技术上如何运作 .

    阅读node-async文档我找到了一些函数来实现这个目的:

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

相关问题