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 个 MutableMap,它们经常被丢弃和垃圾收集。由于我事先知道所需的大小,是否可以从一开始就生成正确大小的 mutableMap?

该错误在 mm.getOrElseUpdate - 行中引发。

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

4

1 回答 1

4

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

于 2016-03-06T01:51:18.007 回答