什么是将大型数据集加载到R中的最快方法和最快格式?

3

我有一个非常大的数据集(未压缩约13GB),需要反复加载。第一次加载(并保存到不同的格式)可能会非常缓慢,但之后每一次加载都应尽可能地快速。从哪种最快的方式和格式中加载数据集?

我怀疑最佳选择是类似于

 saveRDS(obj, file = 'bigdata.Rda', compress = FALSE)
 obj <- loadRDS('bigdata.Rda)

但是,使用data.table包中的fread函数似乎比这种方法慢。这不应该是这样的,因为fread函数将文件从CSV格式转换(尽管它确实高度优化)。对于一个大约800MB的数据集,一些计时如下:
> system.time(tmp <- fread("data.csv"))
Read 6135344 rows and 22 (of 22) columns from 0.795 GB file in 00:00:43
     user  system elapsed 
     36.94    0.44   42.71 
 saveRDS(tmp, file = 'tmp.Rda'))
> system.time(tmp <- readRDS('tmp.Rda'))
     user  system elapsed 
     69.96    2.02   84.04

先前的问题

这个问题与R的当前状态有关,例如一个回答建议从二进制格式读取将始终比文本格式快。而使用 SQL 的建议在我这种情况下也没有帮助,因为需要整个数据集,而不仅仅是它的子集。

还有相关的问题,例如一次加载数据的最快方式(例如:1)。


2
你期望人们在没有提供任何数据的情况下回答吗?我真的看不出这个问题的意义,因为似乎你已经发现了快速的方法。 - Rich Scriven
2
我是其中一个投反对票的人,而且我很快就要将其关闭为重复问题,因为我真的很难看出这个问题会提供什么信息,而这些信息在其他地方已经被充分涵盖了。 - joran
@joran,我没有看到其他解释为什么fread比loadRDS更快的答案。这似乎与加载二进制格式始终比加载文本格式更快的信念不一致。如果我只问那个问题,会有帮助吗? - orizon
@joran,我目前没有争论这个问题的倾向或热情,但选择重复问题似乎不太好。所选择的重复问题仅涉及在表格格式中读取文本数据。我在我的问题中链接的相似问题更接近于我所问的问题。 - orizon
@orizon 我在你的问题中没有看到任何一个“为什么”。如果你对为什么一种方法比另一种方法更快感兴趣,我认为这是完全不同的问题。虽然我不确定这是否适合作为SO的好问题,因为完整的答案可能需要写一篇长篇论文。 - Gregor Thomas
显示剩余3条评论
1个回答

5

这取决于您计划如何处理数据。如果您想将整个数据读入内存以进行某些操作,那么我认为您最好使用fread或readRDS(如果数据保存在RDS中,则文件大小要小得多,如果这对您很重要)。

如果您将对数据进行汇总操作,我发现将其转换为数据库(使用sqldf)仅需一次,是更好的选择,因为通过在数据上执行SQL查询,后续操作会更快速,但这也是因为我没有足够的RAM来加载13 GB的文件到内存中。


使用 saveRDS 保存的文件大小较小的原因之一是因为它使用了压缩,这会降低性能;尽管更高效的因子和字符表示方式也可能有所帮助。 - orizon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接