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)。