V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
slmaaw
V2EX  ›  Node.js

请教 nodejs 中数据占用内存的计算方法

  •  
  •   slmaaw · 2022-04-07 20:43:32 +08:00 via Android · 6909 次点击
    这是一个创建于 742 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个空对象{}或者 map ,向其中塞入以下 kv:

    key 是 uuid<string>

    value 是时间戳数字<number>(类似 Date.now())

    请问塞入 100 万个的话,这个对象或者 map 会占用多大内存?
    7 条回复    2022-04-08 10:15:39 +08:00
    eason1874
        1
    eason1874  
       2022-04-07 20:50:07 +08:00
    1GB 以上吧,你本地写段代码真塞 100 万数据进去不就知道了
    eason1874
        2
    eason1874  
       2022-04-07 20:52:42 +08:00
    不对,脑子短路了,算错了,应该不到 100MB
    noe132
        3
    noe132  
       2022-04-07 20:53:29 +08:00
    不同引擎实现不同占用的内存也不同。
    不过可以大概估算,uuid 就是个 36 字符的字符串,number 如果格式统一就是个 int32 。如果没有介入优化,通常就是一个大数组,那么就是字符串+int32 的大小 x 1m 。如果介入优化,还需要加上 hashtable 的大小。
    secondwtq
        5
    secondwtq  
       2022-04-07 23:37:22 +08:00
    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 字节差不多
    libook
        6
    libook  
       2022-04-08 10:09:07 +08:00
    Node 使用 VM 来运行程序的,这玩意的设计初衷就是让用户把精力放在业务上而不是资源管理上,所以有很多内置的优化策略,以及复杂的 GC 策略,对于用户来说是黑盒,最可靠的方式是进行压测,取个大概的资源数量级。

    如果对内存使用有精确要求,建议使用可以明确操作内存的语言,比如 C/C++。
    wu67
        7
    wu67  
       2022-04-08 10:15:39 +08:00
    8 楼说的很对. 压测基本能分析出你的内存大致占用范围以及部分优化点, 真要更较真的花, 应该选择更底层一点的语言, 如 c/ 汇编.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5224 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 07:32 · PVG 15:32 · LAX 00:32 · JFK 03:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.