视图能够与并行集合一起使用吗?

20

在集合的映射中查找结果的惯用语大致如下:

list.view.map(f).find(p)

其中list是一个List[A]f是一个A => Bp是一个B => Boolean

在并行集合中是否可以使用view?我问这个问题是因为我得到了一些非常奇怪的结果:

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val f : Int => Int = i => {println(i); i + 10}
f: Int => Int = <function1>

scala> val list = (1 to 10).toList
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> list.par.view.map(f).find(_ > 5)
1
res0: Option[Int] = Some(11)

scala> list.par.view.map(f).find(_ > 5)
res1: Option[Int] = None

1
不太清楚发生了什么,但是“视图”产生了奇怪的行为。它在2.8下也是一样的,甚至没有“par”。 - Michael Lorton
在我看来,这似乎是一个bug,并且这种行为在主干上仍然存在。 - Daniel C. Sobral
1
@Malvolio 这很奇怪;我尝试了不使用 .par,对我来说结果如预期的一样(结果始终为 Some(11))。它也可以在没有 .view 的情况下使用 .par,只是两者同时使用就行不通了。 - Luigi Plinge
1
“视图(view)”和“并行集合(parallel collections)”的概念有点相反。 “视图”允许您惰性地使用集合,而“并行集合”则意味着以并行方式使用。 如何证明两者都可以使用? - Dan Burton
1
@Dan 我理解你的观点,但对于像 find 这样的方法来说,这是有意义的。在 ParSeqLike 中存在一个返回 ParSeqViewview 方法表明库设计者认为 ParSeqView 是一个有用的东西。 - Luigi Plinge
这里我得到了与@LuigiPlinge相同的行为:只有在使用“par”时才会出现问题。正确的输出第一次返回,“None”所有其他时间。 - Blaisorblade
1个回答

1

请参阅Martin Odersky等人的论文"A Generic Parallel Collection Framework", 该论文讨论了新的并行集合。第8页有一个名为“Parallel Views”的部分,介绍了如何同时使用viewpar,以及如何从中获得视图和并行计算的性能优势。

至于您提供的具体示例,那肯定是个错误。 exists方法也会出现问题,并且在一个列表上出现问题会影响所有其他列表,因此我认为这可能是一种操作可能被中止的问题(findexists一旦找到答案就可以停止),它们以某种方式破坏了线程池。这可能与并行集合中传递给函数的异常的错误有关。如果是这样,它应该在2.10中得到修复。


感谢提供那篇论文的链接。你提供的那个 bug 看起来并不像这个,但如果它是原因的话,那么使用最新的 2.10 版本构建的人应该能够验证。为了确保,我刚刚打开了一个新的问题:https://issues.scala-lang.org/browse/SI-5525 - Luigi Plinge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接