2011-12-29 61 views
7

我有一个相当大的数据集(约140米行),我正在做一些分裂和总结。整个事情需要一段时间来运行,我的最终应用依赖于频繁跑动,所以我的想法是使用doMC.parallel=TRUE标志,象这样plyr(简化了一下):使用plyr,doMC,并总结()与非常大的数据集?

library(plyr) 
require(doMC) 
registerDoMC() 

df <- ddply(df, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE) 

如果我设置内核数显式为2(使用registerDoMC(cores=2))我的8 GB内存看到我通过,它削减了相当多的时间。但是,如果我让它使用全部8个内核,则由于每个分叉进程似乎都将整个数据集复制到内存中,因此我很快耗尽内存。

我的问题是,是否有可能以更节省内存的方式使用plyr的并行执行工具?我想我的数据帧转换为big.matrix,但这只是似乎迫使整个事情重新使用单核心:

library(plyr) 
library(doMC) 
registerDoMC() 
library(bigmemory) 

bm <- as.big.matrix(df) 
df <- mdply(bm, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE) 

这是我首次涉足多核[R计算,所以如果有一个更好的方法考虑到这一点,我愿意提出建议。

UPDATE:就像生活中许多事情,事实证明我是在我的代码的其他地方做其他愚蠢的事情,那多处理的整个问题成为这种特定情况下一个争论的焦点。但是,对于大数据折叠任务,我会记住data.table。我能够以直截了当的方式复制我的折叠任务。

+3

我想我会留下引用你的** data.table **包的强制性注释,这通常在这些事情上要快得多。 – joran 2011-12-29 15:29:55

+0

嘿,你打败了我! – 2011-12-29 15:32:04

+2

你真的有8个核心吗?或者更确切地说是一个带有4个核心和4个“超线程”核心的英特尔?我有一个运行在MPICH(不是R)下的应用程序,它可以在50%的CPU上很好地扩展到4个,但是当要求8个内核提供100%的CPU时,运行速度要慢得多。 – 2011-12-29 15:36:32

回答

6

我不认为plyr制作整个数据集的副本。但是,在处理大块数据时,该子集将被复制到工作人员。因此,当使用更多的工人时,更多的子集同时在内存中(即8个而不是2个)。

我能想到的一些技巧,你可以尝试:

  • 把你的数据在一个阵列结构的data.frame代替,并使用adply做总结。阵列在内存使用和速度方面效率更高。我的意思是使用正常的矩阵,而不是big.matrix。
  • 试一试data.table,在某些情况下,这会导致几个数量级的速度增加。我不确定data.table是否支持并行处理,但即使没有并行化,data.table可能会快得多。查看blog post of mine比较ave,ddplydata.table用于处理数据块。
+1

你可能想检查那篇博文。你正在比较的三个功能似乎在做不同的任务:只要其中一个正在计算平均值,据我所知。 – 2011-12-29 15:47:24

+0

谢谢,我会看看!我怀疑这并没有改变这个帖子的结果,也就是说data.table更快。 – 2011-12-29 15:50:34