Я написал сценарий узла, который передает ~ 400K строк CSV-строк из двух файлов с использованием модулей csv
npm (csv-parse
, csv-stringify
, stream-transform
) с использованием подхода pipe
и записи водин выходной файл CSV.Для каждой строки определенные поля удаляются, изменяются или добавляются. (*) Я также использую Ramda в надежде, что это сделает сценарий распараллеливаемым и более производительным.
Во-первых, я принудительно parse
и transform
переходят в последовательный режим с помощью {parallel: 1}
и получают следующие результаты:
$ time node index.js
INFO: loaded 252 geonames.
loadGeoNames: 50.537ms
real 3m1.603s
user 2m49.417s
sys 0m4.578s
Теперь, с 50
параллельными обратными вызовами, я сохраняю 8 секунд:
$ time node index.js
INFO: loaded 252 geonames.
loadGeoNames: 43.098ms
real 2m53.249s
user 2m47.690s
sys 0m3.554s
Затем я изменил это значение на 100
и получил следующие результаты:
$ time node index.js
INFO: loaded 252 geonames.
loadGeoNames: 47.953ms
real 2m46.461s
user 2m42.621s
sys 0m3.578s
Так что разница в 15 секунд невелика.Кроме того, читая 400K строк (из двух файлов CSV) и записывая их в один файл (также CSV), я бы ожидал, что это будет быстрее, но у меня нет особого опыта в этой области.
У меня нетИдея, что ожидаемая производительность должна / может быть.Как я могу узнать, где скрипт тратит свое время?
Сам скрипт находится здесь: https://github.com/jfix/geoip-converter/blob/master/index.js
FWIW, я запускаю это на Macbook Pro 2010 с 8 ГБ оперативной памяти.
(*) В частности, скрипт преобразует данные GeoIP из одного формата в другой, поскольку MaxMind прекратил обновлять так называемый «устаревший» формат, но можно преобразовать новый формат (распространение несколькихфайлы) на старый, что я и делаю здесь.Я добавил некоторую справочную информацию в README репо.