2015-04-05 31 views
4

js + sequelize使用JSON插入280K行数据。 JSON是一个280K的数组。有没有办法做块批量插入。我看到更新数据需要很长时间。当我试图将数据减少到40K行时,它的工作很快。我采取了正确的方法吗?请指教。我使用postgresql作为后端。如何使用Sequelize和node.js批量插入

PNs.bulkCreate(JSON_Small) 
     .catch(function(err) { 
      console.log('Error ' + err); 
     }) 
     .finally(function(err) { 
      console.log('FINISHED + ' \n +++++++ \n'); 

     }); 
+0

同样的问题在这里,与一个答案:http://stackoverflow.com/questions/33129677/nodejs-promises-streams-processing-large-csv-files/33138965#33138965 – 2015-10-23 08:44:53

回答

3

我利用异步库的cargo实用程序一次加载多达1000行。请看下面的代码加载一个CSV导入数据库:

var fs = require('fs'), 
    async = require('async'), 
    csv = require('csv'); 

var input = fs.createReadStream(filename); 
var parser = csv.parse({ 
    columns: true, 
    relax: true 
}); 
var inserter = async.cargo(function(tasks, inserterCallback) { 
    model.bulkCreate(tasks).then(function() { 
     inserterCallback(); 
     } 
    ); 
    }, 
    1000 
); 
parser.on('readable', function() { 
    while(line = parser.read()) { 
    inserter.push(line); 
    } 
}); 
parser.on('end', function (count) { 
    inserter.drain = function() { 
    doneLoadingCallback(); 
    } 
}); 
input.pipe(parser); 
1

如果你真的想用bulkInsert,比我以前的答案就足够了。但是,如果您有大量数据,则会耗尽内存!实际上最好使用一些内置的数据库方法,对此最好。问题在于你将所有的数据加载到内存中,直到执行bulkCreate。如果你有一百万行,在执行之前你可能会耗尽内存。即使如此,如果你使用诸如async.cargo之类的东西排队,你仍然会等待数据库返回给你,而数据异步地消耗你所有的内存。

我的解决方案是消除加载数据的续集(至少在他们实现流式处理或其他方法之前(请参阅他们的github issue #2454))。我最终创建了db-streamer,但它现在只支持pg。您需要查看mysql的streamsql