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

发布于 1周前 作者 vueper 来自 nodejs/Nestjs

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

有一个空对象{}或者 map ,向其中塞入以下 kv:

key 是 uuid<string>

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

请问塞入 100 万个的话,这个对象或者 map 会占用多大内存?

8 回复

1GB 以上吧,你本地写段代码真塞 100 万数据进去不就知道了


不对,脑子短路了,算错了,应该不到 100MB

不同引擎实现不同占用的内存也不同。
不过可以大概估算,uuid 就是个 36 字符的字符串,number 如果格式统一就是个 int32 。如果没有介入优化,通常就是一个大数组,那么就是字符串+int32 的大小 x 1m 。如果介入优化,还需要加上 hashtable 的大小。

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 字节差不多

Node 使用 VM 来运行程序的,这玩意的设计初衷就是让用户把精力放在业务上而不是资源管理上,所以有很多内置的优化策略,以及复杂的 GC 策略,对于用户来说是黑盒,最可靠的方式是进行压测,取个大概的资源数量级。

如果对内存使用有精确要求,建议使用可以明确操作内存的语言,比如 C/C++。

8 楼说的很对. 压测基本能分析出你的内存大致占用范围以及部分优化点, 真要更较真的花, 应该选择更底层一点的语言, 如 c/ 汇编.

在 Node.js 中,计算数据占用内存的方法通常涉及使用 V8 引擎提供的工具或库,因为 Node.js 是基于 V8 构建的。虽然直接获取某个数据结构的内存占用不是 Node.js 的内置功能,但你可以使用一些工具和库来实现这一点。

一个常用的库是 heapdump,它可以生成 V8 堆快照,然后你可以使用 Chrome DevTools 分析这些快照。不过,如果你想要更直接的方法,可以考虑使用 v8 模块(如果可用)或者 inspector 模块。

以下是一个使用 inspector 模块和 inspector.Session 的简单示例,它展示了如何获取对象的内存占用(注意,这种方法可能需要 Node.js 的调试支持,并且可能不适用于生产环境):

const inspector = require('inspector');
const session = new inspector.Session();
session.connect();

const obj = { a: 1, b: 'string', c: [1, 2, 3] };

session.post('Runtime.evaluate', {
  expression: `({ obj: ${JSON.stringify(obj)} })`
}, (err, { result }) => {
  if (err) throw err;
  const remoteObjectId = result.result.value.objectId;
  session.post('HeapProfiler.getObjectByHeapObjectId', { objectId: remoteObjectId }, (err, { heapSnapshotObjectId }) => {
    if (err) throw err;
    console.log('Heap snapshot object ID:', heapSnapshotObjectId);
    // 注意:这里只是获取了对象的引用ID,实际内存大小需要进一步分析快照
    session.disconnect();
  });
});

请注意,上述代码仅展示了如何获取对象的引用,并没有直接显示内存大小。要获取准确的内存大小,通常需要更复杂的分析步骤,这通常通过 Chrome DevTools 完成。

回到顶部