私はScalaを使用して、最大の戻り値をもたらす関数へのパラメータを見つけようとしています。私はそれを並行して実行したいと思います。したがって、関数fに渡されたときに最大値を与える範囲(0、x)上の入力パラメータiを探したいと思います。これは私がこれまで持っているものです。並列計算を行うためにScala並行プログラミングを使用するにはどうすればよいですか?
import scala.concurrent.ops._
def parMap(f: Long => (Double, Long), xs: List[Int]): Array[(Double, Long)] = {
val results = new Array[(Double, Long)](xs.length)
replicate(0, xs.length) { i => results(i) = f(xs(i)) }
results
}
var results = parMap(i => (f(i), i), List.range(0, i)).max
それが正常に働くかもしれないが、私はjava.lang.OutOfMemoryErrorを取得:Javaのヒープ領域のエラーを。私が取り組んでいる問題については、結果全体がメモリに収まらないほど大きすぎるため、これまで見たものより劣った結果を破棄する必要があります。私は、メモリ内のすべてのフィット感と、それのために十分に小さいリストの範囲を作成する場合は、私の結果は、Array(それが最大のメソッドを呼び出す前に)一種の次のようになります。
Array(null, null, (-Infinity,2), (-Infinity,3), null, (-Infinity,5), (-Infinity,6), (-Infinity,7), (-Infinity,8), (-22184.3237904591,9), null, (-22137.315048628963,11)...
-Infinity値は、私は何のために正常ですやっていますが、nullはありません。私はそれがランダムですので、私はそれを実行するたびに異なるnullを取得します。これは、いくつかの関数呼び出しでレプリケート・メソッド 'give up'に似ていて、代わりにnullを与えます。
注意Scala 2.8.1を使用しています。
また、私にはスカラとパラレルコンピューティングについての正確なドキュメントは出てこないようです。私はもっと学びたいので、私はこのような問題を自分で見つけ出すことができます。誰もが私が学ぶことができる信頼できるリソースを提案することはできますか?
ようこそ。 "...それは働きません"というスタイルのステートメントは、あまり働かないので(エラーメッセージ/症状のような詳細を含むように編集することができます)、 2.7と2.8の差になります)。 –
Scala 2.9 Parallelコレクションをご覧くださいhttp://stackoverflow.com/q/3740505/203968、2.9はこちらhttp://www.scala-lang.org/node/212/distributions – oluies
Scala 2.9にもありますmaxByメソッドなので、書き込むことができます(0までi).par.maxBy(f) –