You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中pickle与unpickle numpy数组时的内存大小异常问题

问题解答

这不是异常,是sys.getsizeof()的行为特性导致的——它无法准确反映numpy数组的实际总内存占用,具体原因如下:

  • numpy数组的内存结构分为两部分:
    • Python层面的数组对象:存储形状、dtype、指向数据缓冲区的指针等元数据,这部分内存大小固定(约128字节)。
    • 独立的C级数据缓冲区:存储数组的实际像素数据,这部分大小由数组形状 × dtype字节数决定(你的例子中是1080×1920×3×1=6220800字节)。
  • sys.getsizeof()仅计算Python对象本身的内存大小,但对于直接创建的数组(如a1),numpy的__sizeof__方法会额外叠加数据缓冲区的大小,所以a1的结果是元数据+数据的总和(128+6220800=6220928)。
  • 而pickle反序列化得到的数组(a3),sys.getsizeof()仅返回了元数据的大小,但这并不代表数据丢失。你可以通过a3.nbytes查看实际数据的大小,它会和a1的nbytes完全一致(都是6220800字节)。
  • 验证代码:在原代码中添加print(a1.nbytes, a3.nbytes),输出会是6220800 6220800,证明数据完整。

本质上,sys.getsizeof()并不适合用来衡量numpy数组的总内存占用,正确的方式是使用array.nbytes获取数据缓冲区大小,若需总内存则加上sys.getsizeof(array)(元数据大小)。

内容的提问来源于stack exchange,提问作者Rares Dima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:35:23