gpt4 book ai didi

database - Node : Batch insert of large number of rows into a database

转载 作者:搜寻专家 更新时间:2023-10-31 22:45:56 24 4
gpt4 key购买 nike

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

我知道如何使用 for() 或 underscore.each() 遍历数组,我还知道如何将记录异步插入到各种(非)SQL 数据库中。这不是问题 - 问题是我想不出同时做这两件事的方法。

数据库分布本身在这里不起作用,该原则适用于任何具有异步接口(interface)的 (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 中异步解决这个问题 - 用于教育目的。

有什么建议吗?

最佳答案

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

阅读 Node 异步文档我发现了一些函数来实现这一点:

async.map//遍历一个数组

async.each//并行遍历一个数组

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

async.eachLimit//通过 n(limit)个并行调用并行遍历数组。

例如:

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

关于database - Node : Batch insert of large number of rows into a database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21388642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com