使用" println"

时间:2016-11-23 10:32:16

标签: scala matrix apache-spark time

一个棘手的问题与执行时间的急剧增加有关。

我在本地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
          }
      }
}

1 个答案:

答案 0 :(得分:1)

TL; DR

这不需要与Spark做任何事情。对控制台的I / O访问是同步的并且成本高昂。它会减慢JVM上的任何程序(Scala / Java / Clojure /...)。

println defaults to java.lang.System.out这是PrintStreamprintln委托给PrintStream#println,因此输入synchronized block of the println实现输出到控制台:有两种费用:

  • 获得同步锁定
  • 控制台OutputStream的I / O

预计会出现放缓。只是不要在代码的热门部分使用println(就像在这种情况下的紧密循环)。

相关问题