有一个空对象{}或者 map ,向其中塞入以下 kv:
key 是 uuid<string>
value 是时间戳数字<number>(类似 Date.now())
请问塞入 100 万个的话,这个对象或者 map 会占用多大内存?
key 是 uuid<string>
value 是时间戳数字<number>(类似 Date.now())
请问塞入 100 万个的话,这个对象或者 map 会占用多大内存?

1GB 以上吧,你本地写段代码真塞 100 万数据进去不就知道了 |
2 eason1874 Apr 7, 2022 不对,脑子短路了,算错了,应该不到 100MB |
3 noe132 Apr 7, 2022 不同引擎实现不同占用的内存也不同。 不过可以大概估算,uuid 就是个 36 字符的字符串,number 如果格式统一就是个 int32 。如果没有介入优化,通常就是一个大数组,那么就是字符串+int32 的大小 x 1m 。如果介入优化,还需要加上 hashtable 的大小。 |
4 krapnik Apr 7, 2022 |
5 secondwtq Apr 7, 2022 Chrome 的 Web Inspector 里面有一个 Memory Tab ,可以分析内存占用。 试了一下: const l = 1000000, data = {} for (let i = 0; i < l; i++) data[i.toString().padStart(36, '0')] = Date.now()+i; key 约占 48MB ,也就是说一个 string 48 字节,value 占 12MB ,一个 number 12 字节,再加上外面约 25MB ,一个键值对应该是 24 字节差不多 |
6 libook Apr 8, 2022 Node 使用 VM 来运行程序的,这玩意的设计初衷就是让用户把精力放在业务上而不是资源管理上,所以有很多内置的优化策略,以及复杂的 GC 策略,对于用户来说是黑盒,最可靠的方式是进行压测,取个大概的资源数量级。 如果对内存使用有精确要求,建议使用可以明确操作内存的语言,比如 C/C++。 |
7 wu67 Apr 8, 2022 8 楼说的很对. 压测基本能分析出你的内存大致占用范围以及部分优化点, 真要更较真的花, 应该选择更底层一点的语言, 如 c/ 汇编. |