Ana*_*eev 5 python memory windows pandas
我发现 pandas 和 python 报告的内存使用情况与操作系统报告的 python 进程的实际内存使用情况不匹配(在我的情况下是 Windows)。
导入 numpy、pandas 和其他一些标准库(如 os、sys)后,自身进程的 RAM 消耗,报告 psutil 并与 Task Manger 一致,等于89 020 K。
然后我创建由对象和数字 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'
Run Code Online (Sandbox Code Playgroud)
创建数据框后 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
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是非常合乎逻辑的。
现在,让我们得到
<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
Run Code Online (Sandbox Code Playgroud)
195 312.6
还有呢
df.memory_usage(index=True,deep=False).sum()/1024
Run Code Online (Sandbox Code Playgroud)
了不起
771 484.5
我无法解释。
根据熊猫的文档,
在没有深入内省的情况下,基于列 dtype 和行数进行内存估计,假设值对相应的 dtype 消耗相同的内存量。通过深度内存自省,以计算资源为代价执行真实的内存使用计算。
所以我们可以期待深度选项更精确。怎么不是?我错过了什么?为什么会给出错误的结果?这是一个功能还是一个错误?
我还不得不说,python 本身在使用sys模块时给出了错误的结果:
df.memory_usage(index=True,deep=True).sum()/1024 ?
Run Code Online (Sandbox Code Playgroud)
771 484.52
我正在使用 Jupyter 笔记本服务器 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
麻木:1.16.2
我在 CentOS 7 上使用 Pandas 1.0.3 和 Python 3.7.4 运行了这个。我得到了相同的结果。似乎df.memory_usage(index=True,deep=True)都是getsizeof越野车。如果我检查process.memory_info()[0]创建前后的(RSS Resident Set Size)dataframe,差异为 191 MB。