【问题标题】:scala parallel collections not consistentscala并行集合不一致
【发布时间】:2016-10-17 14:07:28
【问题描述】:

我从以下代码中得到不一致的答案,我觉得很奇怪。

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

在代码中a.par ... 计算14 10。谁能解释为什么它的计算不一致?

【问题讨论】:

    标签: scala parallel-processing


    【解决方案1】:

    在您的“seqop”函数中,即您传递给aggregate 的第一个函数中,您定义了用于组合same 分区内的元素的逻辑。您的函数如下所示:

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

    问题是您没有累积分区的结果。相反,你扔掉了你的累加器x。每次结果为 10 时,计算 2^2 就会被删除。

    如果你改变你的函数来考虑累计值,你每次都会得到 14:

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

    【讨论】:

      【解决方案2】:

      聚合的正确使用方式是

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

      通过使用 (x,y) => pow(y,2) ,您没有将项目累积到累加器,而是将累加器替换为 pow(y,2)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        • 2012-06-06
        • 2012-10-03
        • 1970-01-01
        • 2011-08-02
        • 2017-04-03
        相关资源
        最近更新 更多