Я пытаюсь загрузить огромные CSV-файлы (до миллионов строк размером в гигабайт) в приложение Electron Js, которое я создал. Каждая строка CSV-файлов будет иметь ~ 10-50 числовых функций, ничего сложного, таких как строка, кавычки. файл будет считан в список объектов с минимальной обработкой
Для управления памятью я выбрал потоковую передачу файла CSV с использованием fast-csv следующим образом:
const result = []
const stream = fs.createReadStream(filename, {highWaterMark : 5096 * 1024});
const t0 = performance.now();
csv.parseStream(stream, { headers: true, quote:null})
.on("data", function(d) {
count = count +1;
let temp = {
x:+d.x,
y:+d.y,
z:+d.z,
selected: true,
highlighted: false,
}
for (let i = propertyList.length; i--;) {
temp[propertyList[i]] = +d[propertyList[i]];
}
result.push(temp)
})
.on("end", function() {
console.log(" End of file import, read: ",count);
console.log(" took: ",performance.now() - t0);
callback(null);
});
Проблема заключается в приведенный выше код выглядит относительно медленно. для файла ~ 3000 записей на моем компьютере это займет ~ 150 мс (даже если я закомментирую функцию данных), а для файла с ~ 30 000 000 записей - 210 000 мс.
Поскольку для тестирования 3000 записей требуется одинаковое количество времени, даже если я ничего не делаю с каждой строкой, я считаю, что проблема с производительностью была вызвана fs.createReadStream. Я пытался играть с опцией highWaterMark
без особого успеха.
Не могли бы вы, ребята, помочь мне оптимизировать этот код? Я, конечно, открыт для решений, использующих и другие библиотеки.
Большое спасибо!