scala并行集合不一致
我从下面的代码中得到了不一致的答案,我觉得很奇怪scala并行集合不一致,scala,parallel-processing,Scala,Parallel Processing,我从下面的代码中得到了不一致的答案,我觉得很奇怪 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),
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
导入scala.math.pow
val p=2
val a=数组(1,2,3)
印刷品(A.PAR)
.合计(“0”)((x,y)=>s“$y pow$p;”,(x,y)=>x+y))
对于(i功率(y,p),(x,y)=>x+y)==14)
}
a、 map(x=>pow(x,p)).sum
<代码>代码> A.Par…< /代码>计算<代码> 14 <代码> <强>或< /强>代码> 10 < /代码>。有人能解释为什么计算不一致吗?在“seqop”函数中,这是您传递给聚合的第一个函数,您定义了用于在同一分区内组合元素的逻辑。您的函数如下所示:
(x, y) => pow(y, p)
问题是您没有累积分区的结果。相反,您将丢弃累加器x
。每次你得到10作为结果,计算2^2
被删除
如果将函数更改为将累计值考虑在内,则每次将得到14:
(x, y) => x + pow(y, p)
使用聚合的正确方法是
a.par.aggregate(0.0)(
(acc, value) => acc + pow(value, 2), (acc1, acc2) => acc1 + acc2
)
通过使用(x,y)=>pow(y,2),您没有将项目累加到累加器中,而是将累加器替换为pow(y,2)