将顺序集合转换为并行集合的成本是多少,而不是从头开始创建它

时间:2012-04-04 03:41:27

标签: scala collections parallel-processing parallel-collections

根据to the official docs,有两种方法可以创建并行集合:

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所说,有一篇专注于这个主题的文档,但我正试图获得“经验丰富的建议”。我的意思是,如果你必须从数据库中读取一个大集合,你会怎么做。

2 个答案:

答案 0 :(得分:3)

取决于收藏品。 Vector基本上是免费的,ParVector只是向量的包装器。 Arrays也是如此。其他人,例如List,必须完全复制到不同的结构中,更符合并行性。如果您希望结果也是List,则将其复制回新列表。

您可以查看this brand new guide on the scala documentation site,创建并行集合部分。

答案 1 :(得分:3)

par方法的官方文档说:

  

对于大多数集合类型,此方法通过复制所有元素来创建新的并行集合。对于这些集合,par需要线性时间 [...]

     

特定集合(例如ParArraymutable.ParHashMap)通过创建共享相同基础数据集的并行集合来覆盖此默认行为。对于这些集合,par需要恒定的或次线性时间。

也就是说,通常在O(n)中的操作,除了使用可变集合ParArrayParHashMap时,它少于O(n) - 但可能不是恒定的时间。