从节点读取stdin的大输入

时间:2017-01-13 15:36:30

标签: node.js stdin

我必须能够从stdin读取大量输入(10 ^ 5空格分隔数字)。任何高于10 ^ 3的输入和readline只需要200秒就可以读取它,我需要能够在不到5秒的时间内完成。我应该使用readline以外的东西还是有办法增加readline的缓冲区?

2 个答案:

答案 0 :(得分:2)

像在锡上所说的那样,readline用于读取线条。由于你的空格分隔数字(大概)都在一条非常长的行上,所以readline有问题并不奇怪。

使用Transform stream解决这个问题非常容易,但您不必这样做,因为有人已经为您完成了工作。看一下split2模块,它接收一个数据流并将其拆分到给定的分隔符上。你可以这样使用它:

const split2 = require('split2');

process.stdin
  .pipe(split2(' '))
  .pipe(process.stdout);

在我的机器上(MacBook Pro,英特尔酷睿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));

这在我的机器上的0.28s中的1e5数字和在1.87s中的1e6相加。 (为什么它更快?大概是因为它只写了一行输出,写入STDOUT显然比解析整数和添加更昂贵。)

答案 1 :(得分:0)

检查process.stdin

根据您的目的,您甚至可以使用pipe()将可写流附加到process.stdin