我正在考虑有效地将数据读入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会更快(如第二次测试所示)。
感谢您提供任何帮助或意见。
亲切的问候
答案 0 :(得分:0)
我从R-help@r-project.org列表中得到了一些回复,我试着在这里总结一下。所有答案都可以找到here和here。
按照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
总结。读取/加载取决于文件位置,未压缩文件的readRDS
快于load
。但请记住,在R-help@r-project.org上给出了Ismail Sezen的答案:
为什么有2个名为 readRDS 和加载的函数?
因为他们有不同的目的。您使用_load _function来读取/加载 通过保存功能批量保存变量,并使用 readRDS 功能 读取/加载由 saveRDS 函数保存的单个变量。所以,这是不可避免的 两种功能都针对不同目的进行了优化这就像是 比较苹果和梨,两者都是水果。有时你想吃苹果 但有时梨。
结果,如果我需要保存并读取单个R对象,我更喜欢 readRDS / saveRDS情侣。如果我需要将多个对象序列化为文件,我会使用 加载/保存夫妇。
答案 1 :(得分:0)
如果退出R会话并快速重新启动一个新会话,是否会重复“首次读取非常慢”的行为? 如果是这样,则操作系统可能是在第一次从磁盘读取文件时对其进行缓存。