【发布时间】:2018-03-28 07:09:16
【问题描述】:
有一个 RDD 包含这样的元素:
( (n_1, n_2, r), List( (t1,t2), (t3,t4), ... )
我正在尝试执行以下操作:
def p_rec_l(k: Int, acc: Double, pvals_sum: Double, n_1: Int, n_2: Int, r: Int): Double = {
if (k==r-1) return 1 - (pvals_sum + acc)
return p_rec_l(k+1, acc*f(k.toDouble, n_1, n_2), pvals_sum+acc, n_1, n_2, r)
}
def f(k:Double, n_1: Int, n_2:Int): Double = (n_1-k)*(n_2-k)/((k+1)*(N-n_1-n_2+k+1))
N = 2000000
someRDD.map({
case (key, value) => (key, {
val n_1 = key._1; val n_2 = key._2; val r = key._3
val p_k0 = (0 to n_2-1).iterator.map(j => 1- n_1/(N-j.toDouble)).reduceLeft(_*_)
val pval = p_rec_l(0, p_k0, 0, n_1, n_2, r)
value.map({
case (t1, t2) => (t1, t2, n_1, n_2, r, pval)
})
})
})
但是如果 r 很大,就会出现堆栈溢出异常,整个进程就会崩溃。我编辑了这样的代码:
someRDD.map({
case (key, value) => (key, {
val n_1 = key._1; val n_2 = key._2; val r = key._3
val p_k0 = (0 to n_2-1).iterator.map(j => 1- n_1/(N-j.toDouble)).reduceLeft(_*_)
var pval = -1.0
try{
pval = p_rec_l(0, p_k0, 0, n_1, n_2, r)
} catch{
case e: java.lang.StackOverflowError => pval = -1
}
value.map({
case (t1, t2) => (t1, t2, n_1, n_2, r, pval)
})
})
})
在版本之前,程序大约需要 7 个小时才能完成,但现在已经运行了 36 个小时,还没有完成。 有没有可能这个 try-catch 子句减慢了执行速度?如果是的话,有什么办法可以改善吗?
【问题讨论】:
标签: scala apache-spark stack-overflow tail-recursion