我正在将一个巨大的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 个字节。