加速RData加载

32

我查看了几个相关的问题,例如这个:

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

我引用了最受欢迎回答中的特定部分:

这取决于你想要做什么以及你如何进一步处理数据。无论如何,如果你总是需要相同的数据集,从二进制 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倍。感谢您的贡献!


有趣的是我得到了不同的体验。我有一个300 MB的文件,通过saveRDS变成了5 GB。压缩后的文件被load读取花费了383.81秒,而第二个则需要readRDS 1085.14秒。我刚刚发现了saveRDS,所以我会仔细研究这个函数,但我的第一次体验并不是我所期望的。 - Waldir Leoncio
3个回答

12

save默认进行压缩,因此解压文件需要额外的时间。然后将更大的文件加载到内存中需要花费更长的时间。你的pv示例只是将压缩的数据复制到内存中,并没有什么用处。

更新:

我测试了我的理论,结果是不正确的(至少在我的Windows XP计算机上,配备3.3 GHz的CPU和7200RPM的HDD)。加载压缩的文件更快(可能是因为它减少了磁盘I/O)。

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


5
对于这么大的变量,我怀疑大部分时间都花在了内部C代码上 (http://svn.r-project.org/R/trunk/src/main/saveload.c)。您可以运行一些分析工具来验证我的猜测。(在 load 函数中的所有R代码只是检查文件是否非空且未损坏。)
除了将变量读入内存之外,它们(以及其他东西)需要存储在一个R环境中。
唯一明显能够加快加载变量速度的方法就是通过并行编程重写代码,以允许同时加载变量。这可能需要对R系统进行实质性的重写,所以不要指望很快会有这个功能。

你有什么建议可以暂时保存一个大对象,比如一个环境? - Matt Bannert
@MattBannert 这取决于您的使用情况,但建议从“save”开始。 - Richie Cotton
尝试保存包含大量对象的单个环境。保存速度非常慢,这就是我提出问题的原因。 - Matt Bannert

0

RData文件加载时间较长的主要原因是解压缩步骤采用单线程。

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

https://github.com/barkasn/fastSave

但它只能在UNIX上运行(不过你仍然可以在其他平台上打开文件)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接