我发现 pandas 和 python 报告的内存使用情况与操作系统(在我的例子中是 Windows)报告的 python 进程的实际内存使用情况不匹配。
我导入numpy、pandas等一些标准库(如os、sys)后,自身进程的RAM消耗,报psutil,与Task Manger一致,等于 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 千 (再次,与 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 的文档,
Without deep introspection a memory estimation is made based in column dtype and number of rows assuming values consume the same memory amount for corresponding dtypes. With deep memory introspection, a real memory usage calculation is performed at the cost of computational resources.
所以我们可以期待 深 选项更精确。 怎么不是?我错过了什么?为什么会给出错误的结果?这是功能还是错误?
我还不得不说,python 本身在使用 时会给出错误的结果系统 模块:
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
Pandas :0.25.0
NumPy :1.16.2
最佳答案
我在 CentOS 7 上使用 Pandas 1.0.3 和 Python 3.7.4 运行它。我得到了相同的结果。似乎 df.memory_usage(index=True,deep=True)
和 getsizeof
都是 buggy 。如果我检查 process.memory_info()[0]
(RSS 驻留集大小)dataframe
之前和之后创建时,差异为 191 MB。
关于python - pandas 数据帧的准确内存使用估计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57581854/