我编写了一个节点脚本,该脚本使用csv
npm模块(csv-parse
,csv-stringify
,stream-transform
)从两个文件流式传输约40万行CSV行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秒,看起来并不多。另外,我希望读取40万行(从两个CSV文件)并将其写入一个文件(也就是CSV),但是我对此领域的经验并不多。
我不知道预期的性能应该/应该是什么。如何找出脚本在哪里花费时间?
脚本本身在这里: https://github.com/jfix/geoip-converter/blob/master/index.js
FWIW,我正在具有8 GB RAM的2010 Macbook Pro上运行它。
(*)更具体地说,该脚本将GeoIP数据从一种格式转换为另一种格式,因为MaxMind已停止更新所谓的“旧版”格式,但可以将新格式(传播多个文件)转换为旧的,这就是我在这里所做的。我已经在回购自述文件中添加了一些背景信息。