堆 Space 与 mutable.HashMap

Heap Space with mutable.HashMap

我正在生成一个 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 堆 Space。我用

启动了程序
scala -J-Xmx4G TestFak 70000

使用 60000 作为参数它可以工作。我猜,它构建了 70000 个 MutableMap,这些 MutableMap 经常被丢弃并被垃圾收集。由于我事先知道所需的大小,是否可以从一开始就生成一个大小合适的 mutableMap?

错误在 mm.getOrElseUpdate - 行中抛出。

版本: Scala 版本 2.11.6(OpenJDK 64 位服务器虚拟机,Java 1.8.0_66-internal)

70000的阶乘很大!存储所需的 BigInt 本身就相当大!只是给你一个想法,BigInt 可能由 Java 中的 Array[Int] 支持。这意味着存储 1!, 2!, ..., 70000 所需的总大小!对于 n = 70000,将是 sum_(1 to n) of 4 * log_(2^32) n!,大约为 4 GB。