使用mutable.HashMap堆空间

时间:2016-03-05 23:29:41

标签: scala heap mutablemap

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

开始了这个程序
scala -J-Xmx4G TestFak 70000

以60000为参数可行。我想,它构建了70000个MutableMaps,它经常被扔掉并收集垃圾。既然我事先知道了所需的大小,是否有可能从一开始就生成一个大小合适的mutableMap?

mm.getOrElseUpdate - Line中抛出错误。

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

1 个答案:

答案 0 :(得分:4)

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