当前位置: 代码迷 >> java >> Spark:在Scala中与ListBuffer一起使用cogroup时出现内存问题(超出了GC开销限制)
  详细解决方案

Spark:在Scala中与ListBuffer一起使用cogroup时出现内存问题(超出了GC开销限制)

热度:42   发布时间:2023-07-17 20:32:54.0

我有以下代码:

 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即可解决的原因。

  相关解决方案