如何解决用并行集合就地变换数组
| 当具有一组对象时,通常希望(例如出于性能原因)更新(替换)适当的一些对象。例如,如果您有一个整数数组,则可能要用正整数替换负整数:// 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)
使用并行集合库执行此类修改的规范方法是什么?
解决方法
就并行数组而言,这是一个疏忽。下一个版本中可能包含并行数组的并行“ 1”。
但是,您可以使用并行范围来执行此操作:
for (i <- (0 until a.length).par) a(i) = computeSomething(i)
请注意,并非所有可变集合都可以通过这种方式修改。通常,如果您想在适当位置进行修改,则必须确保它已正确同步。在这种情况下,这对于数组来说不是问题,因为不同的索引将修改不同的数组元素(并且更改在最后对调用者是可见的,因为并行操作的完成保证了所有写操作对调用者都是可见的)。
,顺序可变集合具有像ѭ1这样的方法,它们可以就地工作。
并行可变集合缺少这些方法,但是我不确定其背后是有原因还是仅仅是一个疏忽。
我的回答是您目前不走运,但是您当然可以自己写。
在进行了更多讨论之后,提交机票也许有意义吗?
,如何创建一个并行集合,将索引保存到数组中以进行转换,然后运行foreach来更改给定索引的数组中的一个单元格。
这样,您还拥有更多的控制权,并且可以让四个工人在一个阵列的四分之四上工作。因为仅翻转单个整数符号可能不足以证明并行计算的合理性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。