我已经检查了几个相关的问题,例如这个
我引用了评价最高的答案的特定部分
这取决于您要做什么以及如何进一步处理数据。在任何情况下,从二进制 R 对象加载总是会更快,前提是您总是需要相同的数据集。这里的限制速度是硬盘驱动器的速度,而不是 R。二进制形式是工作空间中数据框的内部表示,因此不再需要转换
我真的是这么想的。然而,生活是关于实验的。我有一个包含 igraph 对象的 1.22 GB 文件。也就是说,我认为我在这里找到的内容与对象类无关,主要是因为您甚至可以在调用“库”之前加载('file.RData')。
该服务器中的磁盘非常酷。正如您可以检查阅读时间到内存
user@machine data$ pv mygraph.RData > /dev/null
1.22GB 0:00:03 [ 384MB/s] [==================================>] 100% `
但是,当我从 R 加载这些数据时
>system.time(load('mygraph.RData'))
user system elapsed
178.533 16.490 202.662
所以加载 *.RData 文件似乎比磁盘限制慢 60 倍,这应该意味着 R在“加载”时实际上做了一些事情。
使用不同硬件的不同R版本我也有同样的感觉,只是这次我有耐心做基准测试(主要是因为有这么酷的磁盘存储,加载实际需要多长时间太可怕了)
关于如何克服这个问题的任何想法?
在答案中的想法之后
save(g,file="test.RData",compress=F)
现在该文件为 3.1GB,而之前为 1.22GB。就我而言,加载解压缩要快一些(到目前为止,磁盘不是我的瓶颈)
> system.time(load('test.RData'))
user system elapsed
126.254 2.701 128.974
将未压缩的文件读入内存大约需要 12 秒,所以我确认大部分时间都花在了设置环境上
我会带着 RDS 结果回来,听起来很有趣
正如所承诺的那样,我们在这里
system.time(saveRDS(g,file="test2.RData",compress=F))
user system elapsed
7.714 2.820 18.112
我得到一个 3.1GB 就像“保存”未压缩一样,虽然 md5sum 不同,可能是因为save
还存储了对象名称
现在读...
> system.time(a<-readRDS('test2.RData'))
user system elapsed
41.902 2.166 44.077
因此结合这两种想法(解压缩和 RDS)运行速度快 5 倍。感谢您的贡献!