这个Scala代码可以使用更少的内存吗?

Geo*_*ing 5 memory-management scala set

考虑以下Set基准:

import scala.collection.immutable._

object SetTest extends App {
  def time[a](f: => a): (a,Double) = {
    val start = System.nanoTime()
    val result: a = f
    val end = System.nanoTime()
    (result, 1e-9*(end-start))
  }

  for (n <- List(1000000,10000000)) {
    println("n = %d".format(n))
    val (s2,t2) = time((Set() ++ (1 to n)).sum)
    println("sum %d, time %g".format(s2,t2))
  }
}
Run Code Online (Sandbox Code Playgroud)

编译和运行产生

tile:scalafab% scala SetTest
n = 1000000
sum 1784293664, time 0.982045
n = 10000000
Exception in thread "Poller SunPKCS11-Darwin" java.lang.OutOfMemoryError: Java heap space
...
Run Code Online (Sandbox Code Playgroud)

即,Scala无法在具有8 GB内存的计算机上代表一组1000万个Int.这是预期的行为吗?有没有办法减少内存占用?

Rex*_*err 10

通用不可变集确实需要大量内存.默认值仅为256M堆,每个对象只留下26个字节.用于不可变集的散列特里通常每个对象需要一到两百个字节,每个元素额外需要60个字节.如果你添加-J-Xmx2G命令行将堆空间增加到2G,你应该没问题.

(例如,这种开销水平是存在位集的一个原因.)