2015-04-05 41 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