java - Spark : memory issues (GC overhead limit exceeded) when using cogroup with ListBuffer in Scala

标签 java scala apache-spark scala-2.10 listbuffer

我有以下代码:

 fTuple2.cogroup(gTuple2).flatMap { t =>

      val fList: ListBuffer[classF] = ListBuffer()
      val gList: ListBuffer[classG] = ListBuffer()

      while (t._2._2.iterator.hasNext) {
        gList.add(t._2._2.iterator.next)
      }

      val fIter = t._2._1.iterator
      while (fIter.hasNext) {
        val f = fIter.next
        val hn = f.getNum()

        //-----------------
        try {
          val gValue = FindGUtiltity.findBestG(hn, gList)
          f.setG(gValue)
        } catch {
          case e: Exception => println("exception caught: " + e);
        }
        fList.add(f)
      }
      fList
 }

并在行:

gList.add(t._2._2.iterator.next)

我收到以下错误:

java.lang.OutOfMemoryError: GC overhead limit exceeded
    at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:48)
    at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:176)
    at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:45)
    at scala.collection.mutable.BufferLike$class.appendAll(BufferLike.scala:147)
    at scala.collection.mutable.AbstractBuffer.appendAll(Buffer.scala:48)
    at scala.collection.mutable.BufferLike$class.append(BufferLike.scala:142)
    at scala.collection.mutable.AbstractBuffer.append(Buffer.scala:48)
    at scala.collection.convert.Wrappers$MutableBufferWrapper.add(Wrappers.scala:80)

当 gList 大小为 1 时,效果很好。但如果 gList 的平均大小约为 5,则会出现内存问题。 classG的实例总数并不太大,因此gList总数不应太大。 gList 实际上在 Scala 中复制了自己吗?有没有更好的方法在 Scala 中创建列表?或者我应该在这里使用一些 Java 列表?

谢谢!

最佳答案

只要至少有一个元素要迭代,您的 while 循环就永远不会结束,因为您在每个循环中都请求一个新的迭代器,并每次都获取第一个元素,将其添加到一个会耗尽内存的列表中。

这就是为什么(根据您的评论)只获取迭代器一次并将其分配给 val 解决了这个问题。

关于java - Spark : memory issues (GC overhead limit exceeded) when using cogroup with ListBuffer in Scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31642276/

相关文章:

java - 类的数组实例

java - 如何将 "double"值与 JOptionPane.showInputDialog 一起使用

java - 在 Java 中使用正则表达式提取值

scala - 发现 "play.api.libs.iteratee.Iteratee[Array[Byte],play.api.mvc.Result]"需要 "play.api.mvc.Result"错误

scala - 使用shapeless scala合并两个不同case类的字段

hadoop - Windows 上的 Spark - winutils 到底是什么,我们为什么需要它?

python - 找到密集向量的最大值,将其设置为 1,其余设置为 0 [pyspark]

java - 在 Android Studio 中与 JDBC 斗争

斯卡拉.MatchError : null on spark RDDs

hadoop - 在每个Spark阶段设置内存