熊猫数据帧的准确内存使用量估计



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

在我导入 numpy、pandas 和其他一些标准库(如操作系统、系统(后,自己进程的 RAM 消耗,报告 psutil 并与任务管理器一致,等于89 020 K

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

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 ?

了不起

771484.5

我无法解释。

根据熊猫的文件,

在没有深入反省的情况下,基于列进行内存估计 dtype 和行数(假设值占用相同的内存( 相应 dtype 的金额。通过深刻的记忆内省,一个 执行实际内存使用量计算的代价是 计算资源。

因此,我们可以期待深度选项更加精确。怎么不是?我错过了什么?为什么它给出错误的结果?这是一个功能还是一个错误?

我还必须说,python本身在使用sys模块时给出了错误的结果:

sys.getsizeof(df)/1024

771484.52

我正在使用Jupyter笔记本服务器5.7.4进行测试,我的规格是

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

平台: AMD64

系统: 视窗-10-10.0.17763-SP0

熊猫:0.25.0

数字:1.16.2

我在 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。

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

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

最新更新