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