scala lazy parallel collection(可能吗?)

时间:2016-11-20 06:07:25

标签: scala parallel-processing stream

有没有办法在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)}  

1 个答案:

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