Итак, в качестве домашнего задания я должен поиграть с несколькими механизмами многопоточности, используя простую интеграцию функции, которая должна привести к числу пи. Реализация должна обрабатывать интервал более 500 миллиардов. Моя текущая реализация обрабатывает цикл for примерно до 50 миллионов при размере кучи 2 ГБ. Теперь мой вопрос: почему реализация использует так много памяти? (Я думаю, это потому, что диапазон должен быть сделан заранее, это правда?) И как мне улучшить использование памяти? Можно ли сделать с параллельными коллекциями или я вынужден использовать пул потоков для чего-то подобного?
Примечание. Я получу полный кредит со следующей реализацией. Это для моего интеллектуального любопытства и моей мечты стать более беглым в 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)
}