簡體   English   中英

Node.js流和數據消失

[英]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,指定了要從文件流中讀取的字節數,並將偵聽器附加到行流的其他事件,但都是徒勞的。

有什么可以解釋這種行為?

謝謝!

我認為這種行為可以用兩件事來解釋:

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

您要做的是手動管道。 它的問題是它不尊重highWaterMark並強制整個緩沖區。

所有這些都會導致byline表現不良。 看到這個: https : //github.com/jahewson/node-byline/blob/master/lib/byline.js#L110-L112 這意味着當緩沖區長度> highWaterMark時,它將停止推線。 但這沒有任何意義! 它不會阻止內存使用量的增長(行仍存儲在特殊的行緩沖區中),但是流不知道這些行,如果流以溢出狀態結束,它們將永遠丟失。

你可以做什么:

  1. 使用pipe
  2. 修改highWaterMarklines._readableState.highWaterMark = Infinity;
  3. 停止使用byline

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM