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

时间:2014-02-13 17:56:15

标签: node.js stream

给定Readable流(可能是process.stdin或文件流),pipe()对自定义Writable流是否可行/切实可行儿童Writable直到一定规模;然后关闭那个孩子的流;打开一个新的Writable流并继续?

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

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

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

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

2 个答案:

答案 0 :(得分:2)

我会在TransformReadable流之间引入Writable。在其_transform中,我会做我需要的所有逻辑。

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

就个人而言,只有当我在某个地方转储数据时,我才会使用可写流,并且我会处理该块。 我尽量避免实施_read_write并滥用转化流。

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

答案 1 :(得分:2)

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

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

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