我正在使用csv-parser库来处理节点中的 csv 解析。该文件可能很大,从 50,000 到 500,000 行不等,甚至可能更大。我必须在 csv 上执行一些计算,在将其提交到服务器之后,我正在考虑将 csv 分成块,然后我可以将这些块提供给工作线程以执行计算。工作线程将获取要跳过的行数,然后在达到特定限制之后开始读取行数。我创建了一个读取流,并通过选择要跳过的行数来传递 csv-parser。我试图对其进行一些基准测试,但在跳线和不跳线之间没有发现明显的好处。即使我阅读了整个文件,有时也比阅读结尾的 30,000 行要快。
我的猜测是,这个问题是因为读取流会一一读取数据,因此对于快速随机访问文件并不完美。
也许我的基准测试是错误的?
这是一段代码
const csv = require('csv-parser');
const bench = require('nanobench');
const fs = require('fs');
const parse = (number) => {
// const results = [];
fs.createReadStream('test.csv').pipe(csv({
skipLines: number
})).on('data', (data) => {}).on('end', () => {});
}
const arr = [0, 30000, 15000, 15000/2, 15000/4, 15000/8];
arr.forEach(item => {
bench(`CSV skip ${item} lines 40 times`, function(b) {
b.start();
for(let i = 0; i < 40; i++) parse(item);
b.end();
})
})
这是输出
# CSV skip 0 lines 40 times
ok ~4.14 ms (0 s + 4139981 ns)
# CSV skip 30000 lines 40 times
ok ~2.05 ms (0 s + 2054537 ns)
# CSV skip 15000 lines 40 times
ok ~2.7 ms (0 s + 2702328 ns)
# CSV skip 7500 lines 40 times
ok ~2.43 ms (0 s + 2434555 ns)
# CSV skip 3750 lines 40 times
ok ~1.97 ms (0 s + 1966652 ns)
# CSV skip 1875 lines 40 times
ok ~2.17 ms (0 s + 2172144 ns)
对于我的目标,还有其他更好的方法吗?