[英]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.