繁体   English   中英

Node.js:将可读流管道拆分为多个顺序可写流

[英]Node.js: splitting a readable stream pipe to multiple sequential writable streams

给定一个Readable流(可能是process.stdin或文件流), pipe()是否可行/切实可行的Writable流将填充子Writable直到某个大小; 然后关闭那个孩子的流; 打开一个新的Writable流并继续?

(上下文是将大量数据从管道上传到CDN,将其分成合理大小的块,而不必先将数据写入磁盘。)

我已经尝试创建一个Writable来处理_write函数中子流的打开和关闭,但是当传入的块太大而不适合现有的子流时会出现问题:它必须将一些块写入旧溪流; 创建新流; 然后在完成_write调用之前等待新流上的open事件。

另一个想法是创建一个额外的DuplexTransform流来缓冲管道,并确保进入Writable的块肯定等于或小于现有子流可以接受的数量,以便给Writable时间更改孩子流过来。

或者,这是否使一切过于复杂,并且有一种更简单的方法来完成原始任务?

我将在ReadableWritable流之间引入一个Transform 在它的_transform ,我会做我需要的所有逻辑。

也许,我只会有一个Readable和一个Transform。 _transform方法将创建我需要的所有可写流

就个人而言,我只在我将数据转储到某个地方时才使用可写流,并且我将完成处理该块。
我尽量避免实现_read_write并滥用Transform流。

但我在你的问题中不明白的一点是写大小。 你是什​​么意思?

在寻找相关问题的答案时,我碰到了这个问题。 如何解析文件并将其行拆分为单独的文件,具体取决于行中的某些类别值。

我尽力改变我的代码,使其与您的问题更相关。 然而,这很快就适应了。 没有测试过。 将其视为伪代码。

var fs = require('fs'),
  through = require('through');

 var destCount = 0, dest, size = 0, MAX_SIZE = 1000;

readableStream
  .on('data', function(data) {
    var out = data.toString() + "\n";
    size += out.length;
    if(size > MAX_SIZE) {
      dest.emit("end");
      dest = null;
      size = 0;
    }
    if(!dest) {
      // option 1. manipulate data before saving them.
      dest = through();
      dest.pipe(fs.createWriteStream("log" + destCount))
      // option 2. write directly to file
      // dest = fs.createWriteStream("log" + destCount);
    }
    dest.emit("data", out);
  })
  .on('end', function() {
    dest.emit('end');
  });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM