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

5
给定一个可读流(可以是 process.stdin 或文件流),是否可能/实际上将其管道传输到自定义的可写流,该流将填充子可写流直到达到一定大小;然后关闭该子流;打开新的可写流并继续?
(背景是将大块数据从管道上传到CDN,将其分成合理大小的块,而无需先将数据写入磁盘。)
尝试创建一个可写流来处理在 _write 函数中打开和关闭子流,但遇到的问题是传入的块太大而无法适应现有的子流:它必须将某些块写入旧流;创建新流;然后等待新流的 open 事件才能完成 _write 调用。
我考虑的另一个想法是创建一个额外的 Duplex 或 Transform 流来缓冲管道并确保进入可写流的块肯定小于或等于现有子流可以接受的数量,以给可写流更改子流的时间。
另外,这是否过于复杂化了一切,原始任务有更简单的方法吗?
2个回答

3

在查找一个相关问题的答案时,我偶然发现这个问题。如何解析文件并根据行中的某个类别值将其拆分为单独的文件。

我尽力修改了我的代码以使其更适用于您的问题。但是,请注意这只是伪代码,并未经过测试。

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');
  });

2
我会在ReadableWritable流之间引入一个Transform。在它的_transform中,我会执行所有需要的逻辑。
也许,我只需要一个可读流和一个转换流。在_transform方法中,我会创建所有需要的可写流。
就个人而言,只有在将数据转储到某个地方并完成处理该块时,我才会使用可写流。我尽可能避免实现_read_write,并滥用转换流。
但是我不理解你问题中提到的大小。你指的是什么?

目标是持续从“可读”流中读取数据,直到通过“可写”流传递1GB。一旦达到1GB,目标“可写”流需要关闭并打开另一个,然后进程继续,从上次离开的同一“可读”流中读取。由于数据高达5GB(CDN的限制),涉及的云服务器具有有限的磁盘和内存空间,因此我不想缓冲它,然后打开一个可写流:它需要是稳定的流。 - gid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接