を呼び出します。だから私は `スカラ並列化のサブセットが、私はサブセットを抽出したいからリストを持っている
`これは小さいリストサイズでは動作しますが、大きなリストでは失敗します。サブセットを並列に呼び出す方法
私は「l」のリストを作ってみました、それ自体平行が、toSetリストがサブセットコールを持っていませんparSeqを返すことで呼び出します。私自身のサブセットアルゴリズムを書く必要がありますか?
は、すべての助けに感謝します。それが失敗した理由は2つの理由が考えられ
を呼び出します。だから私は `スカラ並列化のサブセットが、私はサブセットを抽出したいからリストを持っている
`これは小さいリストサイズでは動作しますが、大きなリストでは失敗します。サブセットを並列に呼び出す方法
私は「l」のリストを作ってみました、それ自体平行が、toSetリストがサブセットコールを持っていませんparSeqを返すことで呼び出します。私自身のサブセットアルゴリズムを書く必要がありますか?
は、すべての助けに感謝します。それが失敗した理由は2つの理由が考えられ
:
両方を実行するために時間がかかりすぎる、同じ問題に関連している:あなたがしようとしています指数関数的に大きくなるイテレータを実現する。結果セットが巨大であるかもしれない -
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(), ?)
ストリームは単なる怠け者リストです。
私は、これはアルゴリズムの問題であることに気づいた、ありがとうございます。 toStreamを使用すると、私はメモリが不足しているのであまり役に立ちませんでした。もう一度お礼します。私はプログラミングから怠惰を取り除き、アルゴリズムを良くしなければなりません:) –
"私はプログラミングから怠惰を取り除き、アルゴリズムを良くしなければなりません:"まあ、逆です、本当に。あなたはプログラミングをより良くして、あなたのalgorthimsに怠惰を置く必要があります:) –
@TheArchetypalPaul true that :) –