如何在R中正确地加载load / readRDS的速度?

时间:2017-08-22 14:15:29

标签: r microbenchmark

我正在考虑有效地将数据读入R并尝试了几种方法来测试load('file.Rdata')readRDS('file.rds')是否更快。文件 file.Rdata file.rds 包含相同的数据,第一个用save(d, 'file.Rdata', compress=F)创建,第二个用saveRDS(d, 'file.rds', compress=F)创建。

首先我使用函数microbenchmark()并且对输出的最大值感到惊讶。

第一次测试:

library(microbenchmark)
microbenchmark(
    n <- readRDS('file.rds'),
    load('file.Rdata')
)


Unit: milliseconds
expr                      min        lq          mean        median      uq          max          neval
n <- readRDS('file.rds')  106.5956   109.6457    237.3844    117.8956    141.9921    10934.162    100
load(fl2)                 295.0654   301.8162    335.6266    308.3757    319.6965    1915.706     100

看起来最大值是异常值。

所以我试过了: 第二次测试:

sapply(1:10, function(x) system.time(n <- readRDS('file.rds'))[3])
elapsed  elapsed  elapsed  elapsed  elapsed  elapsed  elapsed  elapsed  elapsed  elapsed 
10.50    0.11     0.11     0.11     0.10     0.11     0.11     0.11     0.12     0.12 

sapply(1:10, function(x) system.time(load'flie.Rdata'))[3])
elapsed  elapsed  elapsed  elapsed  elapsed  elapsed  elapsed  elapsed  elapsed  elapsed
1.86     0.29     0.31     0.30     0.30     0.31     0.30     0.29     0.31     0.30

这证实了我的怀疑;第一次加载数据需要比以下时间更长的时间。我怀疑这有关如何分配数据以及R不必完全&#39;如果第二次读取数据,则读取数据。

所以问题仍然存在,我该如何进行切合实际的基准测试?从第一次测试我得出结论,读取* .rds文件更快。但这只适用于大量的neval。如果我设置times = 1,则读取* .Rdata会更快(如第二次测试所示)。

感谢您提供任何帮助或意见。

亲切的问候

2 个答案:

答案 0 :(得分:0)

我从R-help@r-project.org列表中得到了一些回复,我试着在这里总结一下。所有答案都可以找到herehere

按照William Dunlap强制垃圾收集的想法,我最终得到了以下代码:

library(microbenchmark)
mb <- microbenchmark(
    gc1 <- gc(),
    n <- readRDS('file.rds'),
    rm(n),
    gc2 <- gc(),
    load('file.Rdata'),
    rm(objectRdata),
    gc3 <- gc(),
    times=1000, control = list(order="inorder", warmup=4)
)

但是,在使用mb$time[mb$expr=="d <- readRDS('file.rds')"]mb$time[mb$expr=="load('file.Rdata')"]提取时间时,它仍然是第一个值,它比以下所有值都大得多。奇怪的是,第一次使用readRDS读取数据的时间最长(大约10秒),而第一次使用load加载大约需要2秒。以下readRDS读数约为0.14秒,而load则需要0.32秒。

到目前为止,文件存储在服务器上。我对在C:上本地存储的文件做了同样的尝试。

当读取/加载本地文件时,所有读数都更接近,readRDS的值为0.14秒,load

为0.33秒

总结。读取/加载取决于文件位置,未压缩文件的readRDS快于load。但请记住,在R-help@r-project.org上给出了Ismail Sezen的答案:

  

为什么有2个名为 readRDS 加载的函数?

     

因为他们有不同的目的。您使用_load _function来读取/加载   通过保存功能批量保存变量,并使用 readRDS 功能   读取/加载由 saveRDS 函数保存的单个变量。所以,这是不可避免的   两种功能都针对不同目的进行了优化这就像是   比较苹果和梨,两者都是水果。有时你想吃苹果   但有时梨。

     

结果,如果我需要保存并读取单个R对象,我更喜欢   readRDS / saveRDS情侣。如果我需要将多个对象序列化为文件,我会使用   加载/保存夫妇。

答案 1 :(得分:0)

如果退出R会话并快速重新启动一个新会话,是否会重复“首次读取非常慢”的行为? 如果是这样,则操作系统可能是在第一次从磁盘读取文件时对其进行缓存。