私は以下のようなコードを持っています。スカラーで並列にマップを反復処理するにはどうすればよいですか?
var arr = new Array[...](map.size)
var i = 0
for((k,value) <- map)
{
arr(i) = (k, someFunc(value))
i += 1
}
このループを並行して実行します。たとえば、8つの別々のスレッドで並列に実行したいとします。 Scalaでこれをどのように達成できますか?
私は以下のようなコードを持っています。スカラーで並列にマップを反復処理するにはどうすればよいですか?
var arr = new Array[...](map.size)
var i = 0
for((k,value) <- map)
{
arr(i) = (k, someFunc(value))
i += 1
}
このループを並行して実行します。たとえば、8つの別々のスレッドで並列に実行したいとします。 Scalaでこれをどのように達成できますか?
あなたは並列コレクションにマップを変換し、サイズ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
何がその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を連続したものに変換します(必要がないかどうかわからないため)。
これはすっきりしています:)! – pythonic