2016-10-17 3 views
0

다음 코드에서 일치하지 않는 답이 나오는 경우가 있습니다. 코드 a.par ...에서스칼라 병렬 콜렉션이 일관성이 없음

import scala.math.pow 

val p = 2 
val a = Array(1,2,3) 

println(a.par 
    .aggregate("0")((x, y) => s"$y pow $p; ", (x, y) => x + y)) 

for (i <- 1 to 100) { 
    println(a.par 
    .aggregate(0.0)((x, y) => pow(y, p), (x, y) => x + y) == 14) 
} 

a.map(x => pow(x,p)).sum 

14또는10를 계산한다. 누구나 컴퓨팅이 일관성없는 이유에 대한 설명을 제공 할 수 있습니까?

답변

6

aggregate에 전달하는 첫 번째 함수 인 "seqop"함수에서 동일 요소 인 파티션 내의 요소를 결합하는 데 사용되는 논리를 정의합니다. 함수는 다음과 같습니다.

(x, y) => pow(y, p) 

문제는 파티션의 결과가 누적되지 않는다는 것입니다. 대신 누적 기 x을 버립니다. 결과적으로 10을 얻을 때마다 2^2 계산은 삭제되었습니다.

당신의 계정에 누적 된 값을 적용하려면 기능을 변경하는 경우

, 당신은 14마다 얻을 것이다 : (X을 사용하여

(x, y) => x + pow(y, p) 
1

집계를 사용하는 올바른 방법은

a.par.aggregate(0.0)(
     (acc, value) => acc + pow(value, 2), (acc1, acc2) => acc1 + acc2 
    ) 

입니다, y) => pow (y, 2), 당신은 누적기에 항목을 누적하지 않았지만 누적기를 pow (y, 2)로 바꿨습니다.

관련 문제