以更快的方式在R中读取大型RDS文件

23

我有一个较大的RDS文件需要在R中读取。但是,读取文件需要相当长的时间。

有没有一种方法可以加快读取速度?我尝试使用 data.table 库以及它的 fread 函数,但是出现了错误。

data <- readRDS("myData.rds")

data <- fread("myData.rds")  # error

4
我会尝试使用 compress = FALSE 保存文件,这可以明显加快读写速度。 - Andrey Shabalin
当我尝试使用saveRDS(data, compress = FALSE)保存文件时,实际上文件大小增加了7倍,并且使用readDRS加载的时间比仅使用saveRDS(data)多了6倍。 - Isaac Zhao
你的RDS文件中有什么类型的数据?RDS是一种通用的存储格式,因此它并不完美。根据你的数据,可能会有更快的存储格式可供选择(如果在你的工作流程中RDS不是必需的话)。 - Billy34
2个回答

1

一种加快大文件读取操作的方法是以压缩模式读取

system.time(read.table("bigdata.txt", sep=","))

user: 170.901
system: 1.996
elapsed: 192.137

现在尝试使用压缩文件进行相同的阅读

system.time(read.table("bigdata-compressed.txt.gz", sep=","))

user: 65.511
system: 0.937
elapsed: 66.198

2
这是关于文本文件的,而原帖中是在询问RDS文件。 - Nick Kennedy
@hshihab,您的解决方案是否也适用于 RDS 文件? - Prradep

0

压缩也会影响 rds 文件的读取速度:

n<-1000
m<-matrix(runif(n^2), ncol=n)
default<-tempfile()
unComp<-tempfile()
saveRDS(m,default)
saveRDS(m, unComp,compress = F)
microbenchmark::microbenchmark(readRDS(default), readRDS(unComp))
#> Unit: milliseconds
#>              expr      min       lq     mean   median       uq      max neval
#>  readRDS(default) 46.37050 49.54836 56.03324 56.19446 59.99967 96.16305   100
#>   readRDS(unComp) 11.60771 13.16521 15.54902 14.01063 17.36194 27.35329   100
#>  cld
#>    b
#>   a
file.info(default)$size
#> [1] 5326357
file.info(unComp)$size
#> [1] 8000070
require(qs)
#> Loading required package: qs
#> qs v0.25.1.
qs<-tempfile()
qsave(m, qs)
microbenchmark::microbenchmark(qread(qs), readRDS(unComp))
#> Unit: milliseconds
#>             expr       min       lq     mean   median       uq      max neval
#>        qread(qs) 10.164793 12.26211 15.31887 14.71873 17.25536 27.08779   100
#>  readRDS(unComp)  9.342042 12.59317 15.63974 14.44625 17.93492 35.12563   100
#>  cld
#>    a
#>    a
file.info(qs)$size
#> [1] 4187017

然而,正如在这里所看到的,这是以文件大小为代价的。存储速度可能也会产生影响。在慢速存储(例如网络、旋转磁盘)上,使用压缩实际上可能更好,因为文件可以更快地从磁盘读取。因此,这是值得尝试的。特定的软件包甚至可能提供稍微更好的性能,qs 具有相同的速度但更小的尺寸,结合了两个世界的优点。对于特定的数据格式,其他软件包可能效果更好,请参见此概述:https://books.ropensci.org/drake/plans.html#special-data-formats-for-targets


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