Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“三通”;Scala流/迭代器_Scala_Stream_Tee - Fatal编程技术网

&引用;“三通”;Scala流/迭代器

&引用;“三通”;Scala流/迭代器,scala,stream,tee,Scala,Stream,Tee,我有一个顺序数据源,表示为简单迭代器(或流)。数据相当大,不适合内存。此外,源代码可以遍历一次,并且获取成本很高。 该源用于一些重过程(黑盒),该过程将迭代器(或流)作为其参数来使用线性数据。 好的,很简单。但如果我有两种不同的消费程序,我该怎么办??正如我所说的,我不想将输入数据吸入类似列表的集合中。我也可以从一开始就重读源代码两次来完成我的任务,但我不喜欢这样,因为这样做没有效果。 如果事实上我需要“tee”(类似于克隆)迭代器(或流)来使用单个一乘两个并行进程,而无需将其缓存到内存集合中。

我有一个顺序数据源,表示为简单迭代器(或流)。数据相当大,不适合内存。此外,源代码可以遍历一次,并且获取成本很高。 该源用于一些重过程(黑盒),该过程将迭代器(或流)作为其参数来使用线性数据。 好的,很简单。但如果我有两种不同的消费程序,我该怎么办??正如我所说的,我不想将输入数据吸入类似列表的集合中。我也可以从一开始就重读源代码两次来完成我的任务,但我不喜欢这样,因为这样做没有效果。 如果事实上我需要“tee”(类似于克隆)迭代器(或流)来使用单个一乘两个并行进程,而无需将其缓存到内存集合中。我认为这样的方法应该做回压,或者更确切地说,如果它消耗源流的速度太快,那么应该限制同级流。有效的解决方案可能应该有一些并行的安全队列缓冲区。 有人知道如何在Scala上(或使用任何外部流库/框架)进行这样的工作吗

PS我发现了一个4岁的类似问题: 不同之处在于,我询问如何使用标准Scala迭代器(或流)或更好的现有库来执行它。

您应该检查一下。该示例使用常量内存从一个文件中读取数据,然后增量写入另一个文件。下面是如何修改其示例以写入两个文件:

...

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))

...

很好,看起来我需要!:-)注意,我已经有了迭代器[MyStructure]。你能给我举个例子,说明如何为两个以迭代器或流为参数的函数提供数据,而不是两个文件(希望不是太复杂)?可以将简单的Scala流转换为fs2流并返回吗?有很多方法可以创建fs2流,其中许多方法在中概述。如果所有其他操作都失败,您始终可以构建一个via。尝试:导入fs2.\import cats.effect.{IO,Sync}val st2=Stream.fromIterator(it0)//从我的源迭代器创建fs2 srteam[NginxRec]//首先尝试的临时消费者(只打印前2条记录):def sink1:Sink[IO,NginxRec]=\u1.take(2).evalMap(nr=>IO.delay(println(nr.datetime)))def sink2:Sink[IO,NginxRec]=uu.take(2).evalMap(nr=>IO.delay(println(nr.datetime)))st2.observe(sink1).observe(sink2)//我在这里吗?我在流中得到了。from迭代器:错误:对类型cats.effect.Sync[F]进行发散隐式扩展……我在这里找到了类似的东西:(部分)“单个发布者/多个订阅者”)。但我仍然看不出这如何解决我的任务。你能用你正在使用的代码示例发布另一个问题吗?