加速RData加载

时间:2012-07-19 11:12:42

标签: r io

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

How to load data quickly into 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% `

然而,当我从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倍。谢谢你的贡献!

3 个答案:

答案 0 :(得分:12)

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

更新:

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:0)

RData文件需要花费一些时间来加载的主要原因是解压缩步骤是单线程的。

fastSave R软件包允许使用并行工具来保存和恢复R会话:

https://github.com/barkasn/fastSave

但是它仅在UNIX上有效(尽管您仍然应该能够在其他平台上打开文件)。