そのため、宿題では、pi になるはずの関数の単純な統合を使用して、いくつかのスレッド化メカニズムで遊ぶことになっています。実装は、5000 億を超える間隔を処理することになっています。私の現在の実装では、2GB のヒープ サイズで最大約 5,000 万の for ループを処理します。ここで私の質問は、なぜ実装がそれほど多くのメモリを使用するのですか? (範囲を事前に作成する必要があるためだと思いますが、これは本当ですか?)そして、メモリ使用量を改善するにはどうすればよいですか?並列コレクションを使用することは可能ですか、それともこのような目的でスレッド プールを使用する必要がありますか?
注:次の実装で完全なクレジットを取得します。これは、私の知的好奇心と、scala をもっと流暢に使いこなせるようになるという私の夢のためです。
import scala.Math
object Pi {
def calculate_pi(interval: Int): Double = {
val start: Long = System.currentTimeMillis;
var duration: Long = 0
var x: Double = 2.0/interval
var y: Double = 0.0
var mypi: Double = 0.0
(x until 1.0 by 1.0/interval).par.foreach(i => {
y = 4.0/(1.0+x*x)
mypi += (1.0/interval)*y
})
duration = (System.currentTimeMillis - start)
println("scala calculate_pi\t" + interval + "\t" + duration + "ms\t" + mypi)
return mypi
}
object Main extends App {
println("Please input the interval for the calculation")
if(args.length < 1) { sys.exit }
val interval = args(0).toInt
Pi.calculate_pi_seq(interval)
Pi.calculate_pi(interval)
}