根据官方文档,有两个选项可以创建并行集合:
1)
// There's a little bug here, doesn't matter for the sake of the question
import scala.collection.parallel.mutable.ParArray
val pv = new ParVector[Int]
2)
val pv = Vector(1,2,3,4,5,6,7,8,9).par
现在,有什么不同?当我从一个简单的顺序集合转换它时,是否存在任何性能损失?
如果你必须创建一个稍微平行的集合(比如说,几千个元素),你会怎么做?你会从头开始创建它还是转换它?
谢谢你们!
编辑:
正如@oxbow_lakes所说,有一篇文档关注这个话题,但我正在努力获得"经验丰富的建议"。我的意思是,例如,如果你必须从数据库中读取一个大集合,你会怎么做。
取决于集合。Vector
基本上是免费的,ParVector
只是向量的包装器。与Arrays
相同。其他的,例如List
,必须以不同的结构完全复制,更易于并行。然后复制回一个新的列表,如果你希望你的结果也是一个列表。
您可以在scala文档网站上的"创建并行集合"一节中查看此全新指南。
par
方法的官方文档中写道:
对于大多数集合类型,此方法通过复制所有元素来创建新的并行集合。对于这些集合,par需要线性时间[…]
特定集合(例如
ParArray
或mutable.ParHashMap
)通过创建共享相同底层数据集的并行集合来覆盖此默认行为。对于这些集合,par需要常量或次线性时间
也就是说,通常情况下,O(n)中的操作,除非使用可变集合ParArray
和ParHashMap
,其中它小于O(n,但可能不是恒定时间。