Node.js:1D与2D阵列中的100M元素 - 意外的内存问题

时间:2017-03-12 20:50:08

标签: javascript arrays node.js memory-management v8

假设我有1亿随机floats我试图保存在数组中。

起初,我将数字保存在2D数组中(基本上是一个矩阵),但后来我想如果我将所有100M元素存储在单个线性1D数组中,我可以更快地完成整个事情。

令我惊讶的是,这件事发生了:

10 000×10 000 2D阵列

创建和操作数组非常快,即使在默认内存限制上,Node也可以毫无困难地运行。

100M-element 1D Array

当尝试生成100M随机浮动时节点抛出
FATAL ERROR: invalid array length Allocation failed - JavaScript heap out of memory
即使用--max_old_space_size=8192

调用

为什么?

这对我来说似乎非常违反直觉。我的猜测是,使一个长数组对象应该比在另一个数组中存储10k数组更具内存效率。

所以,是的,我的问题是:为什么会这样?

1 个答案:

答案 0 :(得分:2)

这在实现方面从版本变为版本,但通常对单个对象的大小存在严格限制。有关详细信息,请参阅https://bugs.chromium.org/p/v8/issues/detail?id=3505

在第一种情况下,你基本上有一个10000指针的数组到其他数组,每个数组自己只有10000。它们不需要在内存中连续 - 与第二个示例不同,在第二个示例中,单个对象中的实际块为100000000。所以你点击了Node运行时设置的(完全任意的)上限(如上面的链接和下面的注释所指出的,这是V8的一个方面,而不是Node特别)。