我查看了几个相关的问题,例如这个:
我引用了最受欢迎回答中的特定部分:
这取决于你想要做什么以及你如何进一步处理数据。无论如何,如果你总是需要相同的数据集,从二进制 R 对象加载始终会更快。在此,限制速度的是你的硬盘速度,而不是 R。二进制形式是数据框在工作区中的内部表示形式,因此不再需要进行转换。
我确实认为这是正确的。然而,生活就是一个不断实验的过程。我有一个包含 igraph 对象的 1.22 GB 文件。也就是说,我认为我所发现的与对象类别无关,主要是因为即使在调用“library”之前,你也可以通过 load('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在“load”时实际上进行了某些操作。
我使用不同硬件和不同版本的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
我使用"save"方法保存后,得到了一个3.1GB的文件,尽管md5sum不同,但这可能是因为"save"方法还存储了对象名称。
现在正在阅读中...
> system.time(a<-readRDS('test2.RData'))
user system elapsed
41.902 2.166 44.077
因此,将解压缩和RDS结合起来使用,可以使运行速度快5倍。感谢您的贡献!
saveRDS
变成了5 GB。压缩后的文件被load
读取花费了383.81秒,而第二个则需要readRDS
1085.14秒。我刚刚发现了saveRDS
,所以我会仔细研究这个函数,但我的第一次体验并不是我所期望的。 - Waldir Leoncio