6

当一个对象有一组对象时,通常需要(例如出于性能原因)更新(替换)一些对象。例如,如果您有一个整数数组,您可能希望将负整数替换为正整数:

// Faster for primitives
var i = 0
while (i < a.length) {
  if (a(i) < 0) a(i) = -a(i)
  i += 1
}

// Fine for objects, often okay for primitives
for (i <- a.indices) if (a(i) < 0) a(i) = -a(i)

使用并行集合库执行此类修改的规范方法是什么?

4

3 回答 3

6

就考虑并行阵列而言 - 这是一个疏忽。transform下一个版本中可能会包含并行阵列的并行。

但是,您可以使用并行范围来执行此操作:

for (i <- (0 until a.length).par) a(i) = computeSomething(i)

请注意,并非所有可变集合都可以通过这种方式进行修改。一般来说,如果你想修改一些东西,你必须确保它正确同步。在这种情况下,这对于数组来说不是问题,因为不同的索引将修改不同的数组元素(并且更改在最后对调用者可见,因为并行操作的完成保证了所有写入对调用者可见)。

于 2011-05-26T18:32:33.017 回答
2

顺序可变集合具有transform就地工作的方法。

并行可变集合缺少这些方法,但我不确定它背后有什么原因,或者它是否只是一个疏忽。

我的回答是你目前运气不好,但你当然可以自己写。

也许在对此进行更多讨论之后提交罚单是有意义的?

于 2011-05-26T16:47:12.800 回答
2

如何创建一个并行集合,将索引保存到数组中以进行转换,然后在给定索引的情况下运行 foreach 来改变数组中的一个单元格。

这样你也有更多的控制权,并且可以让四个工人在阵列的四个四分之一上工作。因为仅仅翻转一个整数符号可能不足以证明并行计算的合理性。

于 2011-05-26T17:41:13.103 回答