2016-10-25 3 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 

편집 : 당신은 모든 변경할 수 값을 제거하여이 코드를 더 "관용"을 만들 수 또는 더 짧은 버전 :

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

깔끔한 :)! – pythonic

1

무엇입니까? i+=1은 무엇입니까?

그렇지 않으면, 당신은 (간단한 예를 들어 int 치의 사용)를 찾고 있습니다 : 당신은 그냥 someFunc(b)에 의해 b+1를 대체 할 수

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은 병렬 콜렉션 (m.toParArray)을 사용하고 마지막에는 .toArray을 사용하여 parArray를 순차 변환 (순전히 필요하지는 않음)으로 변환하기 때문에 병렬로 실행됩니다.

관련 문제