我必须能够从 stdin 读取大量输入(10^5 空格分隔的数字)。任何超过 10^3 的输入和 readline 都需要近 200 秒才能读取它,我需要能够在不到五秒的时间内完成此操作。我应该使用 readline 以外的其他东西,还是有办法增加 readline 的缓冲区或其他东西?
最佳答案
readline,就像它在 jar 头上所说的那样,旨在读取行。由于空格分隔的数字(大概)都在很长的一行上,因此 readline 遇到麻烦也就不足为奇了。
使用 Transform stream 可以很容易地解决这个问题,但您不必这样做,因为有人已经为您完成了这项工作。看看split2模块,它获取数据流并按给定的分隔符将其分割。你可以像这样使用它:
const split2 = require('split2');
process.stdin
.pipe(split2(' '))
.pipe(process.stdout);
在我的机器(MacBook Pro、Intel Core i7)上,上述处理 100,000 个空格分隔的数字需要 0.41 秒,处理 1,000,000 个数字需要 2.06 秒。
当然,这是非常没有用的。假设我们想对数字求和:
const split2 = require('split2');
let sum = 0;
process.stdin.pipe(split2(' '))
.on('data', data => sum += parseInt(data, 10))
.on('end', () => console.log('Sum: %d', sum));
在我的机器上,1e5 数的总和需要 0.28 秒,1e6 数的总和需要 1.87 秒。 (为什么它更快?大概是因为它只写入一行输出,并且写入 STDOUT 显然比解析 int 和进行加法更昂贵。)
关于node.js - 使用 Node 从 stdin 读取大输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41638173/