js + sequelizeは、JSONを使用して280K行のデータを挿入します。 JSONは280Kの配列です。チャンクで一括挿入する方法はありますか?データの更新に時間がかかることがわかりました。データを4万行に削減しようとしたところ、すばやく動作しました。私は正しいアプローチを取っていますか?アドバイスを下さい。私はpostgresqlをバックエンドとして使用しています。
PNs.bulkCreate(JSON_Small)
.catch(function(err) {
console.log('Error ' + err);
})
.finally(function(err) {
console.log('FINISHED + ' \n +++++++ \n');
});
非同期ライブラリの 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);
これを実現するには、Sequelizeの組み込みbulkCreate
メソッドを使用できます。
User.bulkCreate([
{ username: 'barfooz', isAdmin: true },
{ username: 'foo', isAdmin: true },
{ username: 'bar', isAdmin: false }
]).then(() => { // Notice: There are no arguments here, as of right now you'll have to...
return User.findAll();
}).then(users => {
console.log(users) // ... in order to get the array of user objects
})
本当にbulkInsertを使用したい場合は、以前の回答で十分です。ただし、大量のデータがあると、メモリが不足します。これには、組み込みのデータベースメソッドを使用するのが最善です。問題は、bulkCreateが実行されるまで、すべてのデータをメモリにロードしていることです。 100万行を取得した場合、実行する前にメモリ不足になる可能性があります。それでも、 async.cargo のようなものを使用してキューに入れると、データが非同期にすべてのメモリを消費している間、dbがあなたに戻ってくるのを待っています。
私の解決策は、データをロードするために逐次化を破棄することでした(少なくともストリーミングまたは何かを実装するまで( github issue#2454 を参照))。最終的に db-streamer を作成しましたが、今のところpgがサポートされています。 mysqlの streamsql を確認する必要があります。
次の質問には、ここで必要な同じ答えがあります: NodeJS、promises、streams-大きなCSVファイルの処理