【问题标题】:read file stream line by line synchronously同步逐行读取文件流
【发布时间】:2017-04-21 09:32:39
【问题描述】:

我正在查看 nodejs readline 模块文档的任务,我必须逐行读取一个非常大的文件,它看起来不错。但是对于我的特定任务,我需要它来同步读取行,即。无论如何,不​​能在第 4 行之前读取第 5 行,并且由于节点的性质,我只想确认此代码对于该用法是否安全 -

const readline = require('readline');
const fs = require('fs');

const rl = readline.createInterface({
  input: fs.createReadStream('sample.txt')
});

rl.on('line', (line) => {
  console.log(`Line from file: ${line}`);
});

如果没有,我应该使用/做什么?目前它对我有用,但我不知道它是否适用于大行,下一行的解析速度比前一行等快。

【问题讨论】:

  • 我试过this,一切似乎都很顺利。最后尝试相同的操作,看看是否可以使用var sleep = require('sleep'); 并将sleep 函数替换为sleep.msleep(500 * Math.random());。也许将程序的输出通过管道传输到第二个文件并diff 他们。

标签: javascript node.js parsing readline


【解决方案1】:

我非常怀疑稍后触发的回调是否可能比另一个回调更早执行。 基本上是指event loop和进程的栈。

不过,为了保证我可以建议实现类似于 async/queue 的东西,但能够动态推送回调。

假设你会有这样的东西:

const Queue = require('./my-queue')
const queue = new Queue()

function addLineToQueue(line) {
  queue.push(function() {
    // do some job with line
    console.log(`Line: "${line}" was successfully processed!`)
  })
}

您将修改您的代码:

rl.on('line', (line) => {
  addLineToQueue(line)
  console.log(`Added line to queue: ${line}`)
})

并确保您的队列实现应该从它有任何要执行的任务开始。这样回调的顺序将得到保证。但对我来说,它看起来有点开销。

【讨论】:

  • 但是如果第 4 行是在第 3 行之前提取的,那么您的队列中的订单仍将是 1 2 4 3
  • 不行,直接一行一行的提取。可以将它们改组的唯一方法是-出于某种原因,同步回调执行时间很长,并且下一行抽水。这就是我建议将他们推到队列中的原因。内部队列实现可以在子进程中启动任务,因此我们永远不会遇到阻塞时刻和洗牌。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多