Scala中有10亿个长度列表?

时间:2013-04-01 00:00:28

标签: scala

就像负载测试一样,我在Scala中使用不同的数据结构。只是想知道如何工作甚至创建一个十亿长度的数组。 1亿似乎没有问题,当然没有关于1,000,000,000的真正魔力。我只是看到你可以推动多远。

我不得不在大多数测试中提高内存。 export JAVA_OPTS="-Xms4g -Xmx8g"

// insanity begins ...
val buf = (0 to 1000000000 - 1).par.map { i => i }.toList
// java.lang.OutOfMemoryError: GC overhead limit exceeded

然而,预分配ArrayInt的效果非常好。迭代和构建对象大约需要9秒。有趣的是,使用ListBuffer做几乎任何事情似乎都会自动利用所有核心。但是,上面的代码将无法完成(至少使用8gb Xmx)。

我知道这不是一个常见的情况,我只是搞乱了。但是如果你不得不把一些大块的东西带进内存,那么有更高效的技术吗?类型的数组是否有效?

2 个答案:

答案 0 :(得分:3)

List的每元素开销相当大。每个元素都保存在一个cons单元格中(case class ::),这意味着有一个对象,每个元素都有两个字段。在32位JVM上,每个元素16个字节(不计算元素值本身)。在64位JVM上,它会更高。

对于超大内容,

List不是一个好的容器类型。它的主要特点是非常有效的头/尾分解。如果这是你需要的东西那么你可能只需要处理内存成本。如果不是,请尝试选择更有效的表示。

对于它的价值,我认为内存开销考虑因素是使用Array合理的一件事。关于使用数组有很多警告,所以如果你这样做就要小心。

答案 1 :(得分:1)

鉴于JVM可以合理地在内存中安排Ints数组,如果你真的需要迭代它们,那确实是最有效的方法。如果你用Java做同样的事情,它会产生很多相同的代码。

相关问题