js + sequelize pour insérer 280K lignes de données en utilisant JSON. Le JSON est un tableau de 280K. Existe-t-il un moyen de faire de l'insertion en vrac en morceaux. Je constate qu'il faut beaucoup de temps pour mettre à jour les données. Lorsque j'ai essayé de réduire les données à 40 000 lignes, cela fonctionne rapidement. Suis-je en train de prendre la bonne approche. Veuillez conseiller. J'utilise postgresql comme backend.
PNs.bulkCreate(JSON_Small)
.catch(function(err) {
console.log('Error ' + err);
})
.finally(function(err) {
console.log('FINISHED + ' \n +++++++ \n');
});
J'ai utilisé l'utilitaire cargo
de la bibliothèque asynchrone pour charger jusqu'à 1 000 lignes à la fois. Voir le code suivant pour charger un csv dans une base de données:
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);
Vous pouvez utiliser la méthode bulkCreate
intégrée de Sequelize pour y parvenir.
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
})
Si vous voulez vraiment utiliser bulkInsert, ma réponse précédente est suffisante. Cependant, vous manquerez de mémoire si vous avez beaucoup de données! Il est préférable d'utiliser une méthode de base de données intégrée pour cela. Le problème est que vous chargez toutes les données en mémoire jusqu'à ce que le bulkCreate s'exécute. Si vous avez un million de lignes, vous manquerez probablement de mémoire avant même qu'elle ne s'exécute. Même si vous le mettez en file d'attente à l'aide de quelque chose comme async.cargo , vous attendez toujours que la base de données vous revienne à tous pendant que les données consomment de manière asynchrone toute votre mémoire.
Ma solution était d'abandonner les séquelles pour le chargement des données (au moins jusqu'à ce qu'elles implémentent le streaming ou quelque chose (voir leur github issue # 2454 )). J'ai fini par créer db-streamer , mais il n'a pour l'instant que le support pg. Vous voudrez regarder streamsql pour mysql.
La question suivante a la même réponse que vous avez besoin ici: NodeJS, promesses, flux - traitement de gros fichiers CSV