一个棘手的问题与执行时间的急剧增加有关。
我在本地spark中运行我的scala代码,其中一部分是构建n*n
矩阵。
运行小型数据集时,只需 5s 即可完成。最耗时的部分是构建2000*2000
矩阵。此部分在map
内执行,只处理array
数据结构。
然而,出于好奇,我添加" println"在矩阵构建代码中查看迭代次数。突然间,整个运行时间增加到 1min23s 。
最终结果是一样的。
我是Spark的新手,不知道究竟是什么导致了这种情况。
代码很简单:
val x = someRDD.map(buildMatrix)
def buildMatrix(stringVect:Array[String]): Array[Array[Double]] = {
//var count = 0
val num = stringVect.length
var simi_matrix = Array[Array[Double]]()
for (i<- 0 until num-1){
for (j<- (i+1) until num){
"build the matrix with some computation"
//println(count)
//count += 1
}
}
}
答案 0 :(得分:1)
这不需要与Spark做任何事情。对控制台的I / O访问是同步的并且成本高昂。它会减慢JVM上的任何程序(Scala / Java / Clojure /...)。
println
defaults to java.lang.System.out
这是PrintStream
。 println
委托给PrintStream#println
,因此输入synchronized block of the println
实现输出到控制台:有两种费用:
预计会出现放缓。只是不要在代码的热门部分使用println
(就像在这种情况下的紧密循环)。