2016-10-06 2 views
0

を呼び出します。だから私は `スカラ並列化のサブセットが、私はサブセットを抽出したいからリストを持っている

`これは小さいリストサイズでは動作しますが、大きなリストでは失敗します。サブセットを並列に呼び出す方法

私は「l」のリストを作ってみました、それ自体平行が、toSetリストがサブセットコールを持っていませんparSeqを返すことで呼び出します。私自身のサブセットアルゴリズムを書く必要がありますか?

は、すべての助けに感謝します。それが失敗した理由は2つの理由が考えられ

答えて

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インターフェイスを好む場合は、ストリームに戻ったイテレータを変換できますが、データ構造自体の面であまり差はないが、それはあなたの要件に合う必要がありますので

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

ストリームは単なる怠け者リストです。

+0

私は、これはアルゴリズムの問​​題であることに気づいた、ありがとうございます。 toStreamを使用すると、私はメモリが不足しているのであまり役に立ちませんでした。もう一度お礼します。私はプログラミングから怠惰を取り除き、アルゴリズムを良くしなければなりません:) –

+1

"私はプログラミングから怠惰を取り除き、アルゴリズムを良くしなければなりません:"まあ、逆です、本当に。あなたはプログラミングをより良くして、あなたのalgorthimsに怠惰を置く必要があります:) –

+0

@TheArchetypalPaul true that :) –

関連する問題