Я пытаюсь использовать Scala для нахождения параметра функции, которая выдает наибольшее возвращаемое значение, и я хотел бы сделать это параллельно.Поэтому для этой функции:
def f(i: Long): Double = {
// do something with i and return a double
}
Я хочу найти входной параметр i в диапазоне (0, x), который дает максимальное значение при передаче в функцию f.Это то, что я до сих пор:
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.Для задачи, над которой я работаю, весь набор результатов будет слишком большим, чтобы поместиться в памяти, поэтому необходимо отбросить результаты, которые хуже, чем те, которые мы видели до сих пор.Если я сделаю диапазон списка достаточно маленьким, чтобы он поместился в памяти, мой массив результатов (до вызова метода max) выглядит примерно так:
Array(null, null, (-Infinity,2), (-Infinity,3), null, (-Infinity,5), (-Infinity,6), (-Infinity,7), (-Infinity,8), (-22184.3237904591,9), null, (-22137.315048628963,11)...
Значения -Infinity являются нормальными для чегоЯ делаю, но нули нет.Каждый раз, когда я запускаю его, я получаю разные нули, так что это случайно.Это похоже на то, что метод репликации «отказывается» от некоторых вызовов функций и вместо этого дает ноль.
Примечание. Я использую Scala 2.8.1.
Кроме того, мне кажется, точная документацияна Scala и параллельных вычислений трудно найти.Я хотел бы узнать больше, чтобы я мог самостоятельно разобраться с подобными проблемами.Кто-нибудь может предложить надежный ресурс, из которого я могу поучиться?