0

就像负载测试一样,我在 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)。

我知道这不是一个常见的情况,我只是在胡闹。但是如果你必须把一些大的东西拉到内存中,有没有更有效的技术呢?具有类型的数组是否尽可能高效?

4

2 回答 2

3

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

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

对于它的价值,我认为内存开销考虑是证明使用Array. 使用数组有很多注意事项,所以如果你这样做要小心。

于 2013-04-01T15:05:40.657 回答
1

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

于 2013-04-01T00:10:17.617 回答