javascript - 来自 Object.entries 内存使用情况的 JS 映射
问题描述
我正在尝试找出具有约 20k 个条目的 javascript Map 对象的内存使用情况 - 键是一个字符串,值是一个 1-2 个字符串的数组。我创建了 2 个地图:具有 17k 和 22k 条目。它们在 chrome profiler 中的内存使用量相同 - 怎么样?
为什么 Map 对象的大小只有在创建它们的对象从范围中删除后才不同?另外,我知道 hashmaps 是如何工作的,但是如果有人知道 js Map 如何保持订单,请告诉我(也许只是一个链接列表?)。
function createMap(){
var obj = JSON.parse(bigStringRepresentingTheJSON);
return new Map(Object.entries(obj));
}
查看分析器,我发现两个地图都占用 917kb - 那怎么可能?但是制作它们的对象(obj)需要 786kb 和 1 572kb - 这是合理的。
所以我想也许 Map 拥有一个指向创建它的 obj 的指针,这就是为什么它们的大小没有区别?然后,我使用 createMap 函数让 obj 得到垃圾收集。只有这样,Map 对象才会占用 1 个 9kb 和 2.3kb,这是意料之中的。
解决方案
缩放 Map 很复杂,如果数据大小 << 映射大小,Hashmap 也会更有效,因为这样哈希冲突的频率就会降低。因此,Map 分配的比需要的多是有道理的,它可能会分配一个固定大小的哈希表,然后在需要时进行缩放。
如果这样做了,那么地图的大小完全取决于实现。
所以我想也许 Map 拥有一个指向创建它的 obj 的指针,这就是为什么它们的大小没有区别?
不, Map 仅包含对obj
.
推荐阅读
- c++ - Windows 上的 CUDA 编译问题,Cmake 错误:未找到 CUDA 工具集
- c# - 如何在 UWP 中使用代码模拟 Tab 键按下
- python - 使用 MMdnn IR 接口模型将 Pytorch 模型转换为 Keras 模型
- python - 将字符串列表转换为浮点数的ndarray
- php - Doctrine - 需要使用自定义字段排序或过滤结果
- alexa - 如何在 Alexa 技能中支持代词
- r - 尝试插入由两个不同列(即种族和民族)组合而成的新列
- javascript - 需要('fs-extra')未加载:抛出错误“找不到模块 fs-extra”
- django - Django - 根据 CSV 文件头在运行时确定模型字段并创建模型
- javascript - 在 php 脚本中使用“move_uploaded_file”方法时,ajax 调用后页面刷新