【发布时间】: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