繁体   English   中英

Scala并行化子集调用

[英]Scala parallelize subsets call

我有一个要从中提取子集的列表。 所以我做

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

`这适用于较小的列表,但不适用于较大的列表。 如何使子集调用并行?

我尝试使列表“ l”本身并行,但该列表上的toSet调用返回一个没有子集调用的parSeq。 我必须编写自己的子集算法吗?

感谢所有帮助。

失败的原因可能有两个:

  • 花费太多时间执行
  • 内存不足

两者都与同一个问题有关:您正在尝试实现大小呈指数增长的迭代器。

def subsets(): Iterator[Set[A]]有一个很好的理由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(), ?)

流只是惰性列表,因此在数据结构本身方面并没有太大差异,它应该满足您的要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM