2016-11-20 4 views
3

すべてのオブジェクトをメモリにロードせずにスカラーで並列にストリームを実行する方法はありますか?scala lazy parallel collection(可能ですか?)

注:パーメソッドを使用して、一般的にメモリ

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)} 
+4

は不可能サウンド:「、リスト、キューなどの他のコレクションを、またはストリームは、要素が次々にアクセスされなければならないという意味で本質的に連続している。これらのコレクションは、要素_を類似の並列コレクションにコピーすることによって、パラレルバリアントに変換されます。 "http://docs.scala-lang.org/overviews/parallel-collections/conversions.html –

+0

あなたの質問はかなり曖昧です。私はあなたの質問に答えると思っていますが、より具体的なユースケースを考えていると思います。 – Rich

答えて

0

にすべてのオブジェクトをロードします、はい、これは可能です。

Tzachゾハールがコメントしたように(the docs参照)

『ストリームは要素が次々にアクセスしなければならないという意味で、本質的に連続している』ので、「.PAR」オペレータが熱心ストリームのすべての要素をロードします

だから、このために、内蔵パラレルコレクションを使用することはできませんが、まだ直接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) 
関連する問題