У меня около 1000 CSV-файлов, которые нуждаются в разборе. Каждый из них содержит около 1000 строк, для 1 миллиона общих записей. Данные необходимо преобразовать, а затем сохранить в db, поэтому я должен сделать это через свое приложение.Метеор/Node.js синтаксический анализ большого количества файлов становится очень медленным
Моя проблема заключается в том, что анализатор постепенно замедляется, когда он перемещается по файлам, до такой степени, что это займет навсегда, чтобы завершить прогон.
Вот как он в настоящее время настроен.
var files = [ file1Path, file2Path.... file1000Path ];
function parseFile(index) {
var startTime = new Date().getTime();
var filePath = files[index];
var stream = fs.createReadStream(filePath);
//parse using fast-csv npm module
csv.fromStream(stream, { config })
.on('data', function (row) {
transformAndSave(row);
})
.on('end', function() {
console.log(new Date().getTime() - startTime + " elapsed ");
parseFile(index + 1)
});
}
parseFile(0);
Я пробовал это несколько разных способов, и каждый раз это одно и то же. Первый файл завершается через 2 секунды, восьмым файлом - 5 или 6 секунд, позже он поднимается до 24 секунд и т. Д. Другие вещи, которые я пробовал, включают в себя выполнение ... files.forEach(function (file) { //run the parser })
, делая партии по 100 на время или даже 5 за раз, и это не имеет значения: он постепенно замедляется со скоростью 500 в секунду до 1 или 2 в секунду.
Есть ли у кого-нибудь идеи о том, как я могу предотвратить это? Отчасти причина может заключаться в том, что stream.on('end')
завершает работу до завершения transformAndSave
, потенциально создавая отставание. Но на данный момент у меня нет идей, и я был бы признателен за любую помощь, которую мог бы предложить любой.
Спасибо за много заранее!
Daniel
примечание для Метеор людей. Я называю эту функцию метеорным методом. Не уверен, что это имеет значение, но в случае, если это произойдет, теперь вы знаете.
Update Вот это выход журнала демонстрирует устойчивый рост использования памяти и времени обработки.
В конце концов, я думаю, что это утечка памяти, связанная с метеоритом, поэтому я отмечаю @Mike P как правильный ответ. Спасибо, Майк! –