当有一个对象数组时,通常需要(例如出于性能原因)更新(替换)一些对象。例如,如果您有一个整数数组,您可能希望将负整数替换为正整数:
// 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)
使用并行集合库执行这样的修改的规范方法是什么?
就并行数组而言,这是一个疏忽。用于并行阵列的并行transform
可能会包含在下一个版本中。
然而,你可以使用一个平行范围:
for (i <- (0 until a.length).par) a(i) = computeSomething(i)
请注意,并不是所有可变集合都可以通过这种方式就地修改。一般来说,如果你想在适当的地方修改某个东西,你必须确保它正确同步。在这种情况下,这对数组来说不是问题,因为不同的索引将修改不同的数组元素(并且这些更改在最后对调用者可见,因为并行操作的完成保证了所有写入对调用者可见)。
Sequential可变集合具有类似transform
的方法,这些方法可以就地工作。
并行可变集合缺少这些方法,但我不确定这背后有什么原因,或者这只是一个疏忽。
我的答案是你目前运气不好,但你当然可以自己写。
也许在这件事讨论得更多之后,申请罚单是有意义的?
创建一个并行集合,将索引保存到要转换的数组中,然后在给定索引的情况下运行foreach来突变数组中的一个单元格。
这样你也有更多的控制权,可以让四个工人在阵列的四个四分之一上工作。因为简单地翻转一个整数符号可能不足以证明并行计算的合理性。