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