gpt4 book ai didi

javascript - Node.js Map 中的最大条目数?

转载 作者:IT老高 更新时间:2023-10-28 23:20:17 28 4
gpt4 key购买 nike

我正在制作一个大型 Map在 Node.js v11.9.0 中,它一直失败并显示“ fatal error :无效的表大小分配失败 - JavaScript 堆内存不足”。我的 map 的键和值不应该接近 Node 堆大小的大小,所以我尝试制作一个 map 并将数字键和值插入其中:

var N = Math.pow(2, 26);
var map = new Map();
for (var i = 0; i < N; i++) {
map.set(i, i + 1);
if (i % 1e5 === 0) { console.log(i / 1e6); }
}

这个程序在插入大约 1660 万个条目后使 Node 崩溃。 这个数字似乎接近 2^24,所以用 if (i > 16777200) { console.log 替换上面的日志记录。 (一世); },我看到程序在成功打印“16777215”后立即崩溃,比2^24小一。

问题。 Node 的 Map 中接近 2^24 的条目数量是否有记录限制?有没有办法提高这个限制?

(注意,以 node --max-old-space-size=4096 运行 Node 并不能防止崩溃,因为 Node 使用的 RAM 远低于 4 GB。)

(注意 2。我认为这不是哈希冲突问题,因为在我的实际代码中,映射包含(短)字符串而不是数字。)

(注意 3。在 Firefox 的 JavaScript 控制台中运行上述程序并不会杀死 Firefox——Firefox 会不断添加超过 3000 万个条目。但是,Chrome 会像 Node 一样崩溃。所以这可能是 V8 的限制。)

最佳答案

V8 开发人员在这里。我可以确认 2^24 是 Map 中的最大条目数。这不是错误,它只是实现定义的限制。

限制由以下因素决定:

  • MapFixedArray 后备存储最大大小为 1GB(与总堆大小限制无关)
  • 在 64 位系统上,这意味着每个 FixedArray
  • 最多 1GB/8B = 2^30/2^3 = 2^27 ~= 134M 个元素
  • 一个Map每个entry需要3个元素(key、value、next bucket link),最大负载因子为50%(避免多次bucket碰撞造成的减速),其容量必须是 2 的幂。2^27/(3 * 2) 向下舍入到 2 的下一个幂是 2^24,这是您观察到的极限。

FWIW,一切都有限制:除了最大堆大小,还有一个最大 String 长度,一个最大 Array 长度,一个最大 ArrayBuffer 长度、最大 BigInt 大小、最大堆栈大小等。这些限制中的任何一个都可能存在争议,有时提高它们是有意义的,但这样的限制仍然存在。在我的脑海中,我不知道将这个特定的限制提高两倍,比如两倍——我也不知道两倍是否足以满足你的期望。

关于javascript - Node.js Map 中的最大条目数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54452896/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com