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

Loading very large CSV dataset into Python and R, Pandas struggles

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

当使用pd.read_csv时,我的文件需要大约30分钟来加载并占用174Gb的内存。 基本上这么多,以至于我无法用它做任何事情。 相比之下,来自data.table封装的R fread()需要约7分钟而且只有~55Gb的存储器。

为什么pandas对象占用的内存比data.table对象多得多? 此外,为什么从根本上说,熊猫对象几乎比磁盘上的文本文件大10倍? 它不像.csv是一种特别有效的方式来存储数据。


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

假设您的文件如下所示:

1
2
a,b
1234567890123456789,12345

在R中,你会得到:

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

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

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

因此你将在python中使用更多的内存。 您可以强制read_csv中的类型作为变通方法:

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

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