0

階乗の場合、必要なサイズを推定できる HashMap を生成しています。

  import scala.collection.mutable.HashMap

  val mm = new HashMap [Int, BigInt] 
  mm.put (0, 1)
  def fak (i: Int) : BigInt = mm.getOrElseUpdate (i, i * fak (i-1))

私は素数の階乗 (fak) を昇順で頻繁に要求し、かなり高い値 (> 10 Mio の階乗) に到達することを好みます。

約 70000 で呼び出すと、OutOfMemory-Error: Java Heap Space が発生します。でプログラムを始めました

scala -J-Xmx4G TestFak 70000

パラメータとして60000を使用すると機能します。おそらく、70000 個の MutableMaps が構築され、頻繁に破棄され、ガベージ コレクションが収集されます。事前に必要なサイズを知っているので、最初から正しいサイズの mutableMap を生成することは可能ですか?

エラーは mm.getOrElseUpdate - Line でスローされます。

バージョン: Scala バージョン 2.11.6 (OpenJDK 64 ビット サーバー VM、Java 1.8.0_66-internal)

4

1 に答える 1

4

70000の階乗は巨大です!それBigInt自体がかなり大きくなる必要がある保存する必要があります。参考までに、BigIntはおそらくArray[Int]in Java によってサポートされています。つまり、1!、2!、...、70000! を格納するために必要な合計サイズです。これは4 ギガバイト程度ですsum_(1 to n) of 4 * log_(2^32) n!n = 70000

于 2016-03-06T01:51:18.007 に答える