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

DataFrame内存占用:sys.getsizeof与pandas memory_usage差异原因咨询

为什么df.memory_usage()和sys.getsizeof(df)结果差这么多?

1. df.memory_usage()本身就没统计全

默认情况下(未加deep=True参数),这个方法只统计DataFrame里的数值数据、索引的内存:

  • 对object类型的列(比如从CSV读取的文本内容),它仅计算每个单元格的指针大小(通常8字节),完全忽略指针指向的实际字符串占用的内存。如果你的数据里文本占比高,这部分漏掉的内存会非常可观。
  • 另外,pandas用于管理DataFrame的内部元数据、缓存的计算结果等额外开销,它也一概不统计。

2. sys.getsizeof()是统计整个Python对象的全部开销

这个函数从Python层面统计df对象的所有内存占用,包括:

  • memory_usage()统计的核心数据部分
  • pandas内部的各种管理结构:列的类型信息、索引的额外属性、缓存的中间结果等
  • 你多次用concat拼接并覆盖df的操作,可能导致DataFrame内部结构膨胀——每次concat都会生成新对象,旧对象的部分内存可能因引用关系未被及时回收,或者拼接过程中产生的临时结构被保留在新对象里,这都会让sys.getsizeof()的结果显著增大。

3. Jupyter的环境特性放大了差异

在Jupyter Notebook中,之前单元格的输出、自动保存的_变量(存储上一次运行结果)可能会保留旧的df对象引用。就算你用新的df覆盖了变量,旧对象也可能没被垃圾回收,导致实际内存中同时存在多个数据副本,这就是为什么你感觉内存快耗尽,但memory_usage()的结果却明显偏低。


可以试试这两个方法验证:

  • 运行df.memory_usage(index=True, deep=True).sum(),加deep=True后会递归统计object列里实际字符串的内存,结果会更接近真实数据占用。
  • 手动触发垃圾回收:import gc; gc.collect(),之后再查看内存,sys.getsizeof()的结果可能会有所下降。

内容的提问来源于stack exchange,提问作者Bijan Beheshti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:45:59