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リストを使用する必要がありますか?

ありがとうございました!

4

1 に答える 1

1

反復する要素が少なくとも 1 つある限り、while ループは決して終了しません。これは、サイクルごとに新しい反復子を要求し、毎回最初の要素を取得して、メモリを吹き飛ばすリストに追加しているためです。

そのため、(コメントに基づいて)イテレータを1回だけ取得し、それをvalに割り当てると解決しました。

于 2016-04-18T17:29:45.527 に答える