【问题标题】:Accurate memory usage estimate of a pandas dataframepandas 数据帧的准确内存使用估计
【发布时间】:2019-12-26 03:44:23
【问题描述】:

我发现 pandas 和 python 报告的内存使用情况与操作系统(在我的例子中是 Windows)报告的 python 进程的实际内存使用情况不匹配。

我导入numpy、pandas等一些标准库(如os、sys)后,自身进程的RAM消耗,报告psutil,与Task Manger一致,等于89020K。 p>

然后我创建由对象和数字 dtypes 组成的示例数据框,如下所示:

    l=5_000_000
    df = pd.DataFrame(np.random.uniform(-100,100,size=l), columns=list('A'))
    df['B']='dsgdb9nsdalWofsT'
    df['C']=np.random.randint(0,130000,size=l).astype(np.int64)
    df['D']=np.random.randint(0,130000,size=l).astype(np.int64)
    df['E']='2JHH'

创建数据框后 psutil 报告 286 696 K(同样,与 Windows 任务管理器一致)。

当运行 df.info() 我得到

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 5000000 entries, 0 to 4999999
Data columns (total 5 columns):
A    float64
B    object
C    int64
D    int64
E    object
dtypes: float64(1), int64(2), object(2)
memory usage: 190.7+ MB

到目前为止,这是非常合乎逻辑的。

现在开始吧

    df.memory_usage(index=True,deep=False).sum()/1024

195 312.6

然后呢

    df.memory_usage(index=True,deep=True).sum()/1024 ?

太棒了

771 484.5

我无法解释。

根据 pandas 的文档,

如果没有深度自省,内存估计是基于列进行的 dtype 和行数假设值消耗相同的内存 对应 dtypes 的数量。通过深度记忆内省,一个 实际内存使用计算是以 计算资源。

所以我们可以期望 deep 选项更精确。 怎么没有?我错过了什么?为什么会给出错误的结果?这是功能还是错误?

我还不得不说,python 本身在使用 sys 模块时会给出错误的结果:

    sys.getsizeof(df)/1024

771 484.52

我正在使用 Jupyter notebook server 5.7.4 进行测试,我的规格是

Python 版本:3.7.2(默认,2019 年 2 月 21 日,17:35:59)[MSC v.1915 64 位 (AMD64)]

平台:AMD64

系统:Windows-10-10.0.17763-SP0

熊猫:0.25.0

numpy:1.16.2

【问题讨论】:

  • 我认为这个 bug 在 pandas 1,0.0 中还没有解决。你有没有找到其他估算的方法?
  • 不,我没有(

标签: python windows pandas memory


【解决方案1】:

我在 CentOS 7 上使用 Pandas 1.0.3 和 Python 3.7.4 运行此程序。我得到了相同的结果。似乎df.memory_usage(index=True,deep=True)getsizeof 都是错误的。如果我在dataframe 创建前后检查process.memory_info()[0](RSS 驻留集大小),差异为191 MB。

【讨论】:

  • 根据我的经验,在加载 JSON 对象中包含数组的大型 JSON 文件时,数据帧内存估计值非常低。我有一个加载到 Pandas 数据框中的 28 MB JSON 文件的示例。 “深度”内存使用量显示为 18 MB,但消耗的 RSS 内存接近 300 MB。 Python 字典和列表似乎有相当大的开销。
【解决方案2】:

我认为这篇文章很好地回答了这个问题: https://pythonspeed.com/articles/pandas-dataframe-series-memory-usage/

简而言之,python 实现中有内存优化,pandas 和 sys 在计算中都没有考虑。因此,通常这些方法报告的内存使用量通常高于实际值。

【讨论】:

  • 所以,~500Mb RAM 的差异是由 .info() 和 .memory_usage(deep=False) 知道的 5M 'dsgdb9nsdalWofsT' 字符串实例和 .memory_usage(deep=True ) 不是吗?
猜你喜欢
  • 2021-06-14
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
相关资源
最近更新 更多