gpt4 book ai didi

Scala 惰性并行集合(可能吗?)

转载 作者:行者123 更新时间:2023-12-02 03:09:19 25 4
gpt4 key购买 nike

有没有办法在scala中并行运行流而不将所有对象加载到内存中?

注意:使用 par 方法,会将所有对象加载到内存中

val list = "a"::"b"::"c"::"d"::"e"::Nil //> list: List[String] = List(a, b, c, d, e)

val s = list.toStream //> s: scala.collection.immutable.Stream[String] = Stream(a, ?)
val sq = s.par //> sq: scala.collection.parallel.immutable.ParSeq[String] = ParVector(a, b, c, d, e)
sq.map { x => println("Map 1 "+x);x }
.map { x => println("Map 2 "+x);x}
.map { x => println("Map 3 "+x);x }
.foreach { x => println("done "+x)}

最佳答案

一般来说,是的,这是可能的。

正如 Tzach Zohar 评论的那样,“.par”运算符将急切地加载 Stream 的所有元素,因为“在元素必须一个接一个访问的意义上,流本质上是顺序的”(参见 the docs)

因此,您不能为此使用内置的并行集合,但您仍然可以使用 ExecutionContext 并行处理流。直接,例如:

import scala.concurrent._
import scala.concurrent.duration.Duration
import scala.concurrent.ExecutionContext.Implicits.global

val infStream = Stream.from(1)

val mappedInfStream = infStream
.map { x => Future(println(s"processing $x on ${Thread.currentThread.getName}")) }

Await.result(
Future.sequence(mappedInfStream.take(100)),
Duration.Inf)

关于Scala 惰性并行集合(可能吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40701215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com