2016-10-25 12 views

答えて

4

あなたは並列コレクションにマップを変換し、サイズ8(またはあなたが望む任意のサイズ)のプールにデフォルトの「TaskSupport」をオーバーライドすることで、スレッドの数を制御できます。

import scala.collection.parallel.ForkJoinTaskSupport 
import scala.collection.parallel.immutable.ParMap 

val parMap: ParMap[Int, Int] = map.par 
parMap.tasksupport = new ForkJoinTaskSupport(new scala.concurrent.forkjoin.ForkJoinPool(8)) 

parMap.foreach { case (k, value) => 
    arr(i) = (k, someFunc(value)) 
    i += 1 
} 

メモしています

val arr = parMap.map { case (k, value) => (k, someFunc(value)) }.toArray 
val i = arr.length 

EDIT:あなたはすべての可変値を削除することによって、このコードより「慣用」を作ることができることや、さらに短いバージョン:

val arr = parMap.mapValues(someFunc).toArray 
val i = arr.length 
+0

これはすっきりしています:)! – pythonic

1

何がそのi+=1のですか?

そうでない場合、あなたは(簡単な例のためにint型を使用して)を探しています:

scala> val m = Map(1 -> 2, 2 -> 3) 
m: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 2 -> 3) 

scala> val mp = m.toParArray map {case(a,b) => (a,b+1)} 
mp: scala.collection.parallel.mutable.ParArray[(Int, Int)] = ParArray((1,3), (2,4)) 

scala> mp.toArray 
res17: Array[(Int, Int)] = Array((1,3), (2,4)) 

あなただけのsomeFunc(b)b+1を置き換えることができます。 someFuncは並列コレクション(m.toParArray)を使用しており、最終的には.toArrayを使用して、parArrayを連続したものに変換します(必要がないかどうかわからないため)。

関連する問題