有没有办法在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)}
答案 0 :(得分:0)
一般来说,是的,这是可能的。
正如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)