我正在生成一个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内部)
答案 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。