【问题标题】:NodeJS, readable stream, push large amounts of data at onceNodeJS,可读流,一次推送大量数据
【发布时间】:2017-03-06 10:17:40
【问题描述】:

我正在尝试实现一个可读流。数据源是一种测量工具,启动时会产生大量数据。 我试图在我的 _read(size) 实现中一次推送大量数据。 当我开始测量并推迟流时,我已经拥有比内部缓冲区更多的数据,我得到了奇怪的行为。

  • 我尝试推送请求大小的数据 -> 错误,需要减少一点(在我的情况下为 32)
  • 即使第一次推送成功,接口又调用_read(size),当我尝试推送请求的大小时,出现错误。内部缓冲区仍然是满的。
  • 当我在数据大于内部缓冲区之前启动流时,一切正常。

这是我的代码:

  _read(size) {
    var bytesAvailible = this._tool.getCurrentAddress() - this._offset;
    var bufferStatus = this._readableState.highWaterMark - this._readableState.length -32;
    var bytesToRead = Math.min(bytesAvailible, size - 32);
    console.log("Cur Addr: ", this._tool.getCurrentAddress().toString(16),
      " hwm: ", this._readableState.highWaterMark,
      " length: ", this._readableState.length,
      " bytesAvailible: ", bytesAvailible,
      " size requested: ", size);
    var chunk = getData(this._offset, bytesToRead);

    if (!this.push(chunk)) {
      console.log("Error pushing.");
      return;
    } else {
      console.log("Pushed address:  ", (this._offset).toString(16), " - ",(this._offset + chunk.length).toString(16), " Size: ", chunk.length);
      this._offset += bytesToRead; // set offset to next address not read;
    }
  }

这里是输出:

Cur Addr:  2000ef20  hwm:  16384  length:  0  bytesAvailible:  61216  size requested:  16384
Pushed address:   20000000  -  20003fe0  Size:  16352
Cur Addr:  2000ef40  hwm:  16384  length:  16352  bytesAvailible:  44896  size requested:  16384
Error pushing.
Cur Addr:  2000ef80  hwm:  16384  length:  16352  bytesAvailible:  44960  size requested:  16384
Error pushing.
Cur Addr:  2000efa0  hwm:  16384  length:  16352  bytesAvailible:  44992  size requested:  16384
Error pushing.
Cur Addr:  20010140  hwm:  16384  length:  32704  bytesAvailible:  49504  size requested:  16384
Error pushing.
Cur Addr:  20010160  hwm:  16384  length:  32704  bytesAvailible:  49536  size requested:  16384
Error pushing.

有人可以帮忙吗? 为什么即使内部缓冲区已满,流也通过调用 _read(size) 来请求数据?为什么内部缓冲区没有被清空?

谢谢!

【问题讨论】:

    标签: node.js stream


    【解决方案1】:

    似乎我错过了理解this.push的返回值。我需要推送数据,直到它返回 false。 当我得到错误时,我试图再次推送块,因为我认为它是不安全的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-11
      • 2021-05-25
      • 1970-01-01
      • 2013-09-22
      • 2023-03-22
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      相关资源
      最近更新 更多