Оптимизация потокового CSV-файла с использованием fast-csv и fs.createReadStream - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь загрузить огромные 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 без особого успеха.

Не могли бы вы, ребята, помочь мне оптимизировать этот код? Я, конечно, открыт для решений, использующих и другие библиотеки.

Большое спасибо!

...