将非常大的CSV数据集加载到Python和R中,Pandas陷入困境

时间:2017-10-31 18:36:19

标签: python r pandas csv data.table

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

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

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

1 个答案:

答案 0 :(得分:13)

你不可能超过fread的速度,但就内存使用而言,我的猜测是你有整数在python中以64位整数读入。 / p>

假设您的文件如下所示:

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文件更多空间的原因,因为例如" 1"在.csv文件中占用2个字节(字符+逗号或行尾),但内存中有4个或8个字节。