【发布时间】:2010-12-13 05:19:13
【问题描述】:
我正在尝试使用 Scala 来查找产生最大返回值的函数的参数,并且我想并行执行此操作。所以对于这个函数:
def f(i: Long): Double = {
// do something with i and return a double
}
我想在传递给函数 f 时给出最大值的范围 (0, x) 上找到输入参数 i。这是我目前所拥有的:
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 heap space 错误。对于我正在处理的整个结果集太大而无法放入内存的问题,因此它需要丢弃不如迄今为止最好的结果。如果我使列表范围足够小以使其全部适合内存,我的结果数组(在它调用 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 值对于我正在做的事情是正常的,但空值不是。每次运行它都会得到不同的空值,所以这是随机的。这就像复制方法在某些函数调用上“放弃”并给出 null。
注意我使用的是 Scala 2.8.1。
另外,在我看来,关于 Scala 和并行计算的准确文档很难获得。我想了解更多,所以我可以自己解决像这样的问题。谁能推荐一个我可以学习的可靠资源?
【问题讨论】:
-
欢迎来到 SO。请注意“......它不起作用......”风格的陈述,因为它们没有提供太多的工作(可以编辑问题以包含错误消息/症状等细节 - 它可能只是 2.7 和 2.8 之间的区别)。
-
看看 Scala 2.9 并行集合 stackoverflow.com/q/3740505/203968,这里有 2.9 scala-lang.org/node/212/distributions
-
Scala 2.9 也有一个 maxBy 方法,所以你可以只写 (0 until i).par.maxBy(f)
标签: scala