node.js - 使用 Node 从 stdin 读取大输入

标签 node.js stdin

我必须能够从 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/

相关文章:

node.js - NodeJS 回调 : tracking db calls so I can terminate the process

c - 在 c 中重新打开 stdin、stdout 或 stderr

linux - 在 bash 进程替换完成输入后,如何继续发送到标准输入?

python - 如何在Python中使用raw_input()在特定字符之后停止读取用户输入?

javascript - Nodejs 编码为 Base64 字符串不起作用

node.js - 使用 session 通过 Mongoose 插件设置created_by用户

c - 如何正确处理scanf()

php - 如何将命令的输出作为另一个命令的输入?

node.js - 资金不能发送到位于我们的账户,因为它在您的平台区域之外

javascript - 如何从nodeJS中的页面调用文件