“ tee” Scala流/迭代器

时间:2018-12-20 12:02:09

标签: scala stream tee

我有一个表示为简单Iterator(或Stream)的顺序数据源。数据很大,不适合存储。同样,该源仅可遍历一次,并且获取成本很高。 在一些繁重的过程(黑匣子)中使用此源,该过程以Iterator(或Stream)为参数来线性消耗数据。 好的,很简单。但是,如果我有两种不同的消费程序,该怎么办?就像我说过的,我不想将输入数据吸入List这样的集合中。我也可以通过从源头开始重新阅读两次来完成任务,但是我不喜欢这样做,因为它无效。 如果确实需要,我需要“准备”(某种克隆)迭代器(或流),以通过两个并行进程使用单个迭代器两次,而不将其缓存到内存集合中。我认为,如果这种方法消耗源流的速度太快,则应该对它们进行反压或限制。有效的解决方案也许应该具有一些并行安全的队列缓冲区。 有谁知道如何在Scala上进行此类操作(或使用任何外部流库/框架)?

PS我发现了一个4岁的类似问题: One upstream stream feeding multiple downstream streams 区别在于,我问如何使用标准的Scala迭代器(或流)或更好的现有库来执行它。

1 个答案:

答案 0 :(得分:0)

您应该签出fs2 streams。该示例从一个文件读取并使用恒定内存递增地写入另一个文件。这是修改他们的示例以写入两个文件的方法:

...

io.file.readAll[IO](Paths.get("testdata/fahrenheit.txt"), blockingEC, 4096)
  .through(text.utf8Decode)
  .through(text.lines)
  .filter(s => !s.trim.isEmpty && !s.startsWith("//"))
  .map(line => fahrenheitToCelsius(line.toDouble).toString)
  .intersperse("\n")
  .through(text.utf8Encode)
  .observe(io.file.writeAll(Paths.get("testdata/celsius.txt"), blockingEC))
  .through(io.file.writeAll(Paths.get("testdata/celsius2.txt"), blockingEC))

...