Node.js:1D vs 2Darrays中的100M个元素 – 意外内存问题

比方说,我有一亿个随机floats我试图保存在一个数组中。

起初,我把数字保存在一个二维数组(基本上是一个matrix)中,但是后来我想,如果我把所有的100M单元存储在一个单一的线性一维数组中,那么我可以把整个数据做得更快。

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

10 000×10000二维arrays

数组的创build和操作是相当快的, 即使默认的内存限制 ,Node也没有任何麻烦。

100M元素一维arrays

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

这是为什么?

这对我来说似乎是非常直观的。 我的猜测是使一个单一的长Array对象应该比另一个数组中存储10k数组更高的内存效率。

所以,是的,我的问题是: 为什么呢?

这个版本的实现方式发生了变化,但总的来说,对单个对象的大小有着严格的限制。 有关详细信息,请参阅https://bugs.chromium.org/p/v8/issues/detail?id=3505

在第一种情况下,你基本上有一个指向其他数组的10000个指针的数组,每个数组只有10000个本身。 他们不需要在内存中是连续的 – 不像第二个例子,在单个对象中有一个100000000的实际块。 所以你碰到一个由Node运行时设置的(完全任意的)上限(正如上面的链接和下面的注释所指出的,这是V8的一个方面,而不是专门的Node)。