gpt4 book ai didi

javascript - Node.js 流和数据消失

转载 作者:行者123 更新时间:2023-11-30 17:22:03 25 4
gpt4 key购买 nike

我一直在玩 Readable 和 Transforming 流,但我无法解开行消失之谜。

考虑一个文本文件,其中的行包含从 1 到 20000 的序列号:

$ seq 1 20000 > file.txt

我创建了一个 Readable 流和一个 LineStream(来自名为 byline 的库:npm install byline;我使用的是 4.1.1 版):

var file = (require('fs')).createReadStream('file.txt');
var lines = new (require('byline').LineStream)();

考虑以下代码:

setTimeout(function() {
lines.on('readable', function() {
var line;
while (null !== (line = lines.read())) {
console.log(line);
}
});
}, 1500);

setTimeout(function() {
file.on('readable', function() {
var chunk;
while (null !== (chunk = file.read())) {
lines.write(chunk);
}
});
}, 1000);

请注意,它首先将监听器附加到 file 可读流的 'readable' 事件,该事件写入 lines 流,仅半秒后,它就将一个监听器附加到 lines 流的 'readable' 事件,它只是将行打印到控制台。

如果我运行这段代码,它只会打印 16384(即 2^14)行并停止。它不会完成文件。但是,如果我将 1500 毫秒的超时更改为 500 毫秒——有效地交换了附加监听器的顺序,它将愉快地打印整个文件。

我试过使用 highWaterMark,指定要从文件流中读取的字节数,将监听器附加到行流的其他事件,所有这些都是徒劳的。

什么可以解释这种行为?

谢谢!

最佳答案

我认为这种行为可以用两件事来解释:

  1. 您如何使用流。
  2. byline 的工作原理。

您所做的是手动管道。它的问题在于它不遵守 highWaterMark 并强制对整体进行缓冲。

所有这些都会导致 byline 表现不佳。看到这个:https://github.com/jahewson/node-byline/blob/master/lib/byline.js#L110-L112 .这意味着当缓冲区长度 > highWaterMark 时它停止推线。但这没有任何意义!它不会阻止内存使用增长(行仍然存储在特殊的行缓冲区中),但流不知道这些行,如果它以溢出状态结束,它们将永远丢失。

你可以做什么:

  1. 使用管道
  2. 修改highWaterMark:lines._readableState.highWaterMark = Infinity;
  3. 停止使用署名

关于javascript - Node.js 流和数据消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24976655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com