【问题标题】:Pandas memory usage gives weird estimatesPandas 内存使用情况给出了奇怪的估计
【发布时间】:2021-02-18 12:26:27
【问题描述】:

Pandas 给出了非常奇怪的内存估计。不可能是包含 2 个数字 列表的列与包含 100 个数字 的列占用几乎相同的内存。 Numpy 的nbytes 更有意义(参见下面的示例),但memory_usagedeep=True 不知道如何处理它?

    import pandas as pd
    import numpy as np

    n_rows = 100000
    vecs_1x2 = np.random.random((n_rows, 2))
    mats_10x10 = np.random.random((n_rows, 10, 10))
    df = pd.DataFrame({'vecs_1x2': list(vecs_1x2), 'mats_10x10': list(mats_10x10)})

    print('numpy - vecs_1x2.nbytes: {} Mb'.format(vecs_1x2.nbytes / 1024.**2))
    print('numpy - mats_10x10.nbytes: {} Mb'.format(mats_10x10.nbytes / 1024.**2))
    print('pandas - df.memory_usage (in Mb):\n{}'.format(df.memory_usage(deep=True, index=False) / 1024.**2))

输出:

    numpy - vecs_1x2.nbytes: 1.52587890625 Mb
    numpy - mats_10x10.nbytes: 76.2939453125 Mb
    pandas - df.memory_usage (in Mb):
    mats_10x10    11.444092
    vecs_1x2       9.918213

怎么样?!

【问题讨论】:

    标签: python pandas numpy memory


    【解决方案1】:

    发生的事情是您正在创建具有对象 dtype 的列。基本上,它存储了一个 Python 对象的 NumPy 数组。

    所以你得到的是一个 NumPy 指针数组,基本上。如果您选择 deep 选项,它也会尝试获取单个项目的内存使用情况,我怀疑使用 sys.getsizeof()

    所以deep=True 是“数组的大小,加上对象大小的任何猜测”:

    >>> sys.getsizeof(df.vecs_1x2.iloc[0]) * n_rows + df.vecs_1x2.memory_usage(deep=False)
    11200128
    >>> df.vecs_1x2.memory_usage(deep=True)
    11200128
    

    现在,sys.getsizeof() 将添加 Python 对象开销:

    >>> sys.getsizeof(df.vecs_1x2.iloc[0])
    104
    >>> df.vecs_1x2.iloc[0].nbytes
    16
    

    但是sys.getsizeof() 不知道对象内部存储了多少内存,这必然是给定任意扩展类型:

    >>> sys.getsizeof(df.mats_10x10.iloc[0])
    120
    >>> df.mats_10x10.iloc[0].nbytes
    800
    >>> sys.getsizeof(df.mats_10x10.iloc[0]) * n_rows + df.mats_10x10.memory_usage(deep=False)
    12800128
    >>> df.mats_10x10.memory_usage(deep=True)
    12800128
    

    TL;DR:对于对象 dtypes,memory_usage() 没有帮助。

    那么如何衡量内存使用情况?

    一个选项是内存分析器。例如,我在专门为数据科学和科学计算设计的Fil memory profiler for Python 上工作。它会告诉您峰值内存使用量以及哪些代码行负责。

    Another profiler 可以向您显示在每行代码上分配了多少内存,这对于分析小型 sn-ps 代码很有用。

    【讨论】:

    • 但是你会认为 pandas 会使用 type,如果他们看到他们有一个 numpy 数组类型,使用类似 nbytes 的东西,不是吗?
    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多