将非常大的CSV数据集加载到Python和R中,Pandas很挣扎



我正在将一个巨大的csv(18GB)加载到内存中,并注意到R和Python之间的差异非常大。这是在具有244 Gb内存的AWS ec2 r4.8xlarge上。显然,这是一个极端的例子,但该原则也适用于真实机器上的较小文件。

使用pd.read_csv时,我的文件需要~30分钟才能加载,并占用了174Gb的内存。基本上太多了,以至于我无法对它做任何事情。相比之下,data.table 封装中的 R fread()需要 ~7 分钟,只有 ~55Gb 的内存。

为什么 pandas 对象比 data.table 对象占用更多的内存?此外,为什么基本上熊猫对象比磁盘上的文本文件大近 10 倍?这并不像.csv首先是一种特别有效的数据存储方式。

你将无法击败fread的速度,但就内存使用情况而言,我的猜测是你有在 python 中作为 64 位整数读取的整数。

假设您的文件如下所示:

a,b
1234567890123456789,12345

在 R 中,你将获得:

sapply(fread('test.txt'), class)
#          a          b
#"integer64"  "integer"

而在 python 中(在 64 位机器上):

pandas.read_csv('test.txt').dtypes
#a   int64
#b   int64

因此,您将在 python 中使用更多内存。作为一种解决方法,您可以在read_csv中强制使用类型:

pandas.read_csv('test.txt', dtype={'b': numpy.int32}).dtypes
#a   int64
#b   int32

小整数也将成为 R 和 python 对象比.csv文件占用更多空间的原因,因为例如.csv文件中的"1"占用 2 个字节(char + 逗号或行尾),但在内存中占用 4 或 8 个字节。

最新更新