[英]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.