我发现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在计算中都没有考虑。因此,通常,这些方法报告的内存使用情况通常高于实际值。