当一个人拥有一个对象数组时,通常需要(例如出于性能原因)更新(替换)某些对象。例如,如果您有一个整数数组,则可能需要将正整数替换为正整数:
// 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)
使用并行集合库执行此类修改的规范方法是什么?
答案 0 :(得分:5)
考虑到并行阵列 - 这是一种疏忽。并行数组的并行transform
可能会包含在下一个版本中。
但是,您可以使用并行范围来执行此操作:
for (i <- (0 until a.length).par) a(i) = computeSomething(i)
请注意,并非所有可变集合都可以通过这种方式进行修改。通常,如果您希望修改某些内容,则必须确保它已正确同步。在这种情况下,这对于数组来说不是问题,因为不同的索引将修改不同的数组元素(并且更改对于调用者最终是可见的,因为并行操作的完成保证所有写入对于调用者是可见的)。
答案 1 :(得分:2)
顺序可变集合具有transform
等可以就地工作的方法。
并行可变集合缺乏这些方法,但我不确定它背后有什么原因,或者它只是一个疏忽。
我的回答是你目前运气不好,但你当然可以自己写。
在讨论了这个问题后,或许可以提交一张票吗?
答案 2 :(得分:2)
如果给出索引,如何创建一个将索引保存到数组中的并行集合进行转换,然后运行foreach来改变数组中的一个单元格。
通过这种方式,您还可以拥有更多控制权,并且可以生成四个工作人员,这些工作人员可以在阵列的四分之三上工作。因为简单地翻转一个整数符号可能不足以证明并行计算的合理性。