[英]Node.js streams and data disappearing
我一直在使用Readable和Transforming流,但无法解决线条消失的谜团。
考虑一个文本文件,其中的行包含从1到20000的连续数字:
$ seq 1 20000 > file.txt
我创建了一个Readable
流和LineStream
(称为署名从库: 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流的'readable'
事件,该事件将写入lines
流,仅半秒钟后,它将侦听器附加到该lines
流的'readable'
事件,该事件仅打印线到控制台。
如果运行此代码,它将仅打印16384(2 ^ 14)行并停止。 它不会完成文件。 但是,如果我将1500ms超时更改为500ms -有效地交换了侦听器的连接顺序,它将很高兴地打印出整个文件。
我尝试过使用highWaterMark,指定了要从文件流中读取的字节数,并将侦听器附加到行流的其他事件,但都是徒劳的。
有什么可以解释这种行为?
谢谢!
我认为这种行为可以用两件事来解释:
byline
工作原理。 您要做的是手动管道。 它的问题是它不尊重highWaterMark
并强制整个缓冲区。
所有这些都会导致byline
表现不良。 看到这个: https : //github.com/jahewson/node-byline/blob/master/lib/byline.js#L110-L112 。 这意味着当缓冲区长度> highWaterMark时,它将停止推线。 但这没有任何意义! 它不会阻止内存使用量的增长(行仍存储在特殊的行缓冲区中),但是流不知道这些行,如果流以溢出状态结束,它们将永远丢失。
你可以做什么:
pipe
highWaterMark
: lines._readableState.highWaterMark = Infinity;
byline
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.