Трябва да имате работа с голям файл с потоци.
Ето едно възможно решение:
var queue = async.queue(collection.insert.bind(collection), 5);
csv()
.from.path('./input.csv', { columns: true })
.transform(function (data, index, cb) {
queue.push(data, function (err, res) {
if (err) return cb(err);
cb(null, res[0]);
});
})
.on('error', function (err) {
res.send(500, err.message);
})
.on('end', function () {
queue.drain = function() {
res.send(200);
};
});
Моля, обърнете внимание:
- че използваме API за поток на
node-csv
, което гарантира, че данните се обработват едновременно с четенето на файла:по този начин целият файл не се чете в паметта наведнъж.transform
манипулатор се изпълнява за всеки запис; - че използваме
async.queue
, което е опашка за асинхронна обработка:най-много 5 манипулатора (finalcollection.insert
) се изпълняват паралелно.
Този пример трябва да се тества, тъй като не съм много сигурен, че се справя наистина добре с обратното налягане. Освен това нивото на паралелност на опашката трябва да се настрои към вашата специфична конфигурация.
Можете също да намерите работеща същност тук .