簡體   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