如何估算Pandas的DataFrame需要多少内存?

我一直在想......如果我正在读取一个400MB的csv文件到一个熊猫数据框中(使用read_csv或read_table),有什么办法来猜测这将需要多少内存? 试图获得更好的数据帧和内存感受...


df.memory_usage()将返回每列占用多少:

>>> df.memory_usage()

Row_ID            20906600
Household_ID      20906600
Vehicle           20906600
Calendar_Year     20906600
Model_Year        20906600
...

要包含索引,请传递index=True

所以要获得整体内存消耗:

>>> df.memory_usage(index=True).sum()
731731000

此外,传递memory_usage ='deep'将启用更准确的内存使用情况报告,该报告说明了包含对象的完整使用情况。

这是因为如果deep = False(默认情况),内存使用情况不包括由非数组的组件所使用的内存。


你必须做相反的事情。

In [4]: DataFrame(randn(1000000,20)).to_csv('test.csv')

In [5]: !ls -ltr test.csv
-rw-rw-r-- 1 users 399508276 Aug  6 16:55 test.csv

技术上的记忆是关于这个(其中包括索引)

In [16]: df.values.nbytes + df.index.nbytes + df.columns.nbytes
Out[16]: 168000160

因此,内存为168MB,400MB文件,1M行20浮点列

DataFrame(randn(1000000,20)).to_hdf('test.h5','df')

!ls -ltr test.h5
-rw-rw-r-- 1 users 168073944 Aug  6 16:57 test.h5

编写为二进制HDF5文件时更加紧凑

In [12]: DataFrame(randn(1000000,20)).to_hdf('test.h5','df',complevel=9,complib='blosc')

In [13]: !ls -ltr test.h5
-rw-rw-r-- 1 users 154727012 Aug  6 16:58 test.h5

数据是随机的,所以压缩不会有太大的帮助


我想我会为讨论带来更多的数据。

我对这个问题进行了一系列测试。

通过使用python resource包,我得到了我的进程的内存使用情况。

通过将csv写入StringIO缓冲区,我可以轻松地以字节为单位测量它的大小。

我进行了两个实验,每个实验创建20个数据帧,增加10,000行和1,000,000行之间的大小。 都有10列。

在第一个实验中,我只在我的数据集中使用了浮点数。

这是内存与csv文件相比作为行数的函数增加的方式。 (以兆字节为单位)

内存和CSV大小(以兆字节为单位),作为具有浮点条目的行数的函数

第二个实验我有相同的方法,但数据集中的数据只包含短字符串。

内存和CSV大小(以兆字节为单位),作为包含字符串条目的行数的函数

似乎csv的大小与数据帧大小的关系可能有很大的不同,但内存大小总是会增大2-3倍(对于本实验中的帧大小)

我很想用更多的实验来完成这个答案,请评论你是否想让我尝试一些特别的东西。

链接地址: http://www.djcxy.com/p/38401.html

上一篇: How to estimate how much memory a Pandas' DataFrame will need?

下一篇: Delete column from pandas DataFrame using del df.column