32

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

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

我引用了评价最高的答案的特定部分

这取决于您要做什么以及如何进一步处理数据。在任何情况下,从二进制 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 倍。感谢您的贡献!

4

3 回答 3

12

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

更新:

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

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

于 2012-07-19T11:40:02.153 回答
5

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

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

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

于 2012-07-19T11:42:51.840 回答
0

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

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

https://github.com/barkasn/fastSave

但它只适用于 UNIX(尽管您应该仍然能够在其他平台上打开文件)。

于 2018-10-12T16:54:17.213 回答