加速RData加载

cya*_*gue 31 io r

我已经检查了几个相关的问题,比如这个

如何快速将数据加载到R?

我引用了最受好评的答案的特定部分

这取决于您想要做什么以及如何进一步处理数据.在任何情况下,只要您始终需要相同的数据集,从二进制R对象加载总是会更快.在这里极限速度是你的硬盘,而不是R的速度.二进制形式是工作空间中数据框的内部表示,因此不再需要转换

我真的这么认为.但是,生活就是在试验.我有一个包含igraph对象的1.22 GB文件.这就是说,我不认为我在这里找到的与对象类有关,主要是因为你甚至可以在调用"library"之前加载('file.RData').

这台服务器中的磁盘非常酷.因为你可以检查内存的阅读时间

user@machine data$ pv mygraph.RData > /dev/null
1.22GB 0:00:03 [ 384MB/s] [==================================>] 100% `
Run Code Online (Sandbox Code Playgroud)

但是,当我从R加载此数据时

>system.time(load('mygraph.RData'))
   user  system   elapsed 
178.533  16.490   202.662
Run Code Online (Sandbox Code Playgroud)

所以看起来加载*.RData文件比磁盘限制慢60倍,这应该意味着R实际上在"加载"时做了一些事情.

我有同样的感觉使用不同的R版本与不同的硬件,这只是这次我耐心做基准测试(主要是因为有这么酷的磁盘存储,负载实际需要多长时间是可怕的)

关于如何克服这个问题的任何想法?


经过回答的想法

save(g,file="test.RData",compress=F)
Run Code Online (Sandbox Code Playgroud)

现在该文件为3.1GB,之前为1.22GB.在我的情况下,加载解压缩速度要快一点(磁盘远远不是我的瓶颈)

> system.time(load('test.RData'))
user  system elapsed 
126.254   2.701 128.974 
Run Code Online (Sandbox Code Playgroud)

将未压缩文件读取到内存大约需要12秒,因此我确认大部分时间都用于设置环境

我将回到RDS结果,听起来很有趣


正如我所承诺的那样

system.time(saveRDS(g,file="test2.RData",compress=F))
user  system elapsed 
7.714   2.820  18.112 
Run Code Online (Sandbox Code Playgroud)

我得到一个3.1GB就像"保存"未压缩,虽然md5sum是不同的,可能是因为save还存储了对象名称

现在看...

> system.time(a<-readRDS('test2.RData'))
user  system elapsed 
41.902   2.166  44.077 
Run Code Online (Sandbox Code Playgroud)

因此,结合两种想法(解压缩和RDS)的速度提高了5倍.谢谢你的贡献!

Jos*_*ich 12

save默认情况下压缩,因此解压缩文件需要额外的时间.然后将较大的文件加载到内存中需要更长的时间.您的pv示例只是将压缩数据复制到内存中,这对您来说并不是很有用.;-)

更新:

我测试了我的理论并且它是不正确的(至少在我的带有3.3Ghz CPU和7200RPM HDD的Windows XP机器上).加载压缩文件的速度更快(可能是因为它减少了磁盘I/O).

额外时间花费在RestoreToEnv(in saveload.c)和/或R_Unserialize(in serialize.c)中.因此,您可以通过更改这些文件来加快加载速度,或者通过使用saveRDS单独保存对象myGraph.RData然后以loadRDS多种方式使用多个R进程将数据加载到共享内存中...


Ric*_*ton 5

对于那些大的变量,我怀疑大部分时间是在内部C代码中占用的(http://svn.r-project.org/R/trunk/src/main/saveload.c).您可以运行一些分析以查看我是否正确.(load函数中的所有R代码都检查您的文件是否为空并且没有损坏.

除了将变量读入内存之外,它们(以及其他内容)需要存储在R环境中.

在加载变量时获得大加速的唯一明显方法是以并行方式重写代码以允许同时加载变量.这可能需要大量重写R的内部,所以不要屏住呼吸这样的功能.