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是一种特别有效的方式来存储数据。
-
与https://stackoverflow.com/questions/17444679/reading-a-huge-csv-file类似
-
@RobertMc不是关于熊猫的
-
你使用1.10.5的fread是新的,在dev中,还没有在CRAN上?也尝试paratext。
-
@MattDowle在哪种情况下你建议fread读错了?问题是为什么Python / Pandas不会镜像fread的内存使用情况。
-
@roganjosh fread在开发中快得多(即1.10.5),这就是我要问的原因。不,我不是说它读错了。 OP还询问速度和内存使用情况。
-
有这么多数据,为什么不将它转换为hdf文件?
-
@ djk47463也许这就是他们想要做的
-
@MattDowle,你可以在任何计算机的块上做到这一点,试图只加载所有数据进行分析我相信
-
没错,我正在尝试将其加载到内存中以运行sklearn模型。我从它输出的数据库输出这个巨大的.tsv这就是为什么我有这个问题。你把它转换成另一种格式(hdf,镶木地板,羽毛等)是对的,我只是想保持管道尽可能简单。旁注:使用data.table将其读取到R,将其写入羽毛,然后将羽毛读入Py??thon需要大约12分钟,而使用pd.read_csv直接使用Python需要大约30分钟。那对我来说太疯狂了。
你将无法超过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个字节。
-
我认为这可能是现货。 我从未想过在read_csv中使用dtype选项。 另外,很多我的专栏只是二进制,但我敢打赌它将所有的1和0视为大整数。 是否有一个有效的numpy类型的二进制(或非常小)整数或我应该只使用int32? 可能不会影响速度,但它肯定会使它变得更小。 谢谢。
-
您可以尝试使用int8。
-
我会试试的。 知道是否有办法说"这一列是int64,其他所有都是int8"? 文档说你必须作为一个字典,但我有几千列(因此文件大),所以这似乎有点乏味。
-
我可能只是阅读前几行,根据名称创建dict,然后阅读整个内容。
-
好决定。 这根本不会很难。 谢谢。