Scala并行化子集调用

时间:2016-10-06 02:29:36

标签: scala parallel-processing set

我有一个List,我想从中提取子集。所以我做了

val l = List(1,2,4).toSet.subsets.toList

`这适用于小型列表,但在大型列表上失败。如何使子集调用并行?

我尝试制作清单' l'本身是并行的,但是对该列表的toSet调用返回一个没有子集调用的parSeq。我是否必须编写自己的子集算法?

感谢所有帮助。

1 个答案:

答案 0 :(得分:1)

失败可能有两个原因:

  • 执行
  • 需要太多时间
  • 内存不足

两者都与同一个问题有关:你试图实现一个指数级增长的迭代器。

有一个很好的理由def subsets(): Iterator[Set[A]]返回迭代器而不是列表 - 结果集可能很大。实际上数量 所有可能的子集都是2^n

scala> (1 to 10).toSet.subsets.size
res0: Int = 1024

scala> math.pow(2, 10)
res1: Double = 1024.0

如果你并行生成子集,你仍然会很快耗尽内存或无休止地等待。换句话说,这是一个算法问题,而不是并发/硬件问题。

解决这个问题的方法是在你去的时候使用延迟生成器(迭代器/流),而不是一次尝试获取所有数据。如果您更喜欢Stream接口,则可以将返回的迭代器转换为stream:

scala> (1 to 10).toSet.subsets.toStream
res2: scala.collection.immutable.Stream[scala.collection.immutable.Set[Int]] = Stream(Set(), ?)

Streams只是惰性列表,因此数据结构本身没有太大差异,它应该符合您的要求。