Node.js:1D 与 2D 数组中的 100M 个元素——意外的内存问题
Node.js: 100M elements in 1D vs 2D Array — Unexpected Memory Issue
假设我有 1 亿个随机 floats
我正在尝试保存在一个数组中。
起初,我将数字保存在一个二维数组(基本上是一个矩阵)中,但后来我想如果我将所有 100M 元素存储在一个线性一维数组中,也许我可以使整个过程更快。
令我惊讶的是,这发生了:
10 000 × 10 000 二维数组
数组的创建和操作非常快,Node 运行没有任何问题即使在默认内存限制下。
100M—元素一维数组
当尝试生成 100M 随机浮点数节点抛出
FATAL ERROR: invalid array length Allocation failed - JavaScript heap out of memory
即使用 --max_old_space_size=8192
调用
这是为什么?
这对我来说似乎很违反直觉。我的猜测是制作一个长数组对象应该比在另一个数组中存储 10k 数组更节省内存。
所以,是的,我的问题是:这是为什么?
这在不同版本的实现中有所不同,但通常对单个对象的大小有硬性限制。有关详细信息,请参阅 https://bugs.chromium.org/p/v8/issues/detail?id=3505。
在第一种情况下,您实际上有一个包含 10000 个指向其他数组的指针的数组,每个数组本身的大小仅为 10000。它们不需要在内存中连续——不像第二个例子,在第二个例子中,你在一个对象中有一个实际的 100000000 块。因此,您达到了 Node 运行时设置的(完全任意的)上限(正如上面的 link 和下面的评论所指出的,这是 V8 的一个方面,而不是 Node 特有的)。
假设我有 1 亿个随机 floats
我正在尝试保存在一个数组中。
起初,我将数字保存在一个二维数组(基本上是一个矩阵)中,但后来我想如果我将所有 100M 元素存储在一个线性一维数组中,也许我可以使整个过程更快。
令我惊讶的是,这发生了:
10 000 × 10 000 二维数组
数组的创建和操作非常快,Node 运行没有任何问题即使在默认内存限制下。
100M—元素一维数组
当尝试生成 100M 随机浮点数节点抛出
FATAL ERROR: invalid array length Allocation failed - JavaScript heap out of memory
即使用 --max_old_space_size=8192
这是为什么?
这对我来说似乎很违反直觉。我的猜测是制作一个长数组对象应该比在另一个数组中存储 10k 数组更节省内存。
所以,是的,我的问题是:这是为什么?
这在不同版本的实现中有所不同,但通常对单个对象的大小有硬性限制。有关详细信息,请参阅 https://bugs.chromium.org/p/v8/issues/detail?id=3505。
在第一种情况下,您实际上有一个包含 10000 个指向其他数组的指针的数组,每个数组本身的大小仅为 10000。它们不需要在内存中连续——不像第二个例子,在第二个例子中,你在一个对象中有一个实际的 100000000 块。因此,您达到了 Node 运行时设置的(完全任意的)上限(正如上面的 link 和下面的评论所指出的,这是 V8 的一个方面,而不是 Node 特有的)。