【问题标题】:node.js -- process out of memorynode.js -- 进程内存不足
【发布时间】:2013-04-28 19:29:19
【问题描述】:

为什么这会给我致命错误:JS 分配失败 - 进程内存不足

arr = []

for (var x=0;x<6000;x++){
    var ys=[];
    arr.push(ys);
    for (var y=0;y<6000;y++){
        var tile = [0,1,2];
        ys.push(tile);
    }
}

在我看来,它只有 108000000 个整数,即 432mb,与 1.4gb 的限制相差甚远

【问题讨论】:

  • 不完全。列表的每个元素都包含对下一个元素的附加引用。但它仍然不应该发生(或者它应该发生?)。你用的是什么版本的 NodeJS?
  • 我的回答对您有帮助吗?你能选择一个答案吗?

标签: node.js memory


【解决方案1】:

你没有计算的东西:

  • 数组对象的开销
  • 对象引用的大小
  • 程序正在执行的任何其他操作
  • Node.js 内存本身

如果我们假设对象引用是 64 位的(不确定大小...),那么您有 3600 万个引用 * 4 字节 = 144 兆字节。

在我们计算阵列开销之前,您最多有 576 MB。

另外,由于数组是可调整大小的,我不确定分配的长度是否完全基于大小,或者运行时是否会分配额外的内存以防万一。

如果我记得,当 Java 中的 ArrayList 展开时,它实际上会翻倍。

我并不确切知道数组是如何在 JavaScript 中实现的,但鉴于读取 array.length 是常数时间,每个数组可能都有一个预先计算的长度属性。

由于您有 3600 万个数组,因此您还有 144 兆字节。

目前为 720 MB,而且还在增加。

我希望这些数组不会像 ArrayList 那样被双重分配。

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 2021-07-05
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    相关资源
    最近更新 更多