我正在将大量的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是一种特别有效的方式来存储数据。
答案 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个字节。