将plyr、doMC和Summary()用于非常大的数据集?

将plyr、doMC和Summary()用于非常大的数据集?,r,plyr,data.table,R,Plyr,Data.table,我有一个相当大的数据集(约140万行),我正在对其进行拆分和汇总。整个过程需要一段时间才能运行,而我的最终应用程序依赖于频繁运行,因此我的想法是使用doMC和带有plyr的.parallel=TRUE标志,就像这样(简化了一点): 这是我第一次涉足多核R计算,所以如果有更好的方法来思考这个问题,我愿意接受建议 更新:与生活中的许多事情一样,事实证明我在代码的其他地方做了其他愚蠢的事情,而在这个特定的例子中,整个多处理问题变得毫无意义。然而,对于大数据折叠任务,我会记住data.table。我能够

我有一个相当大的数据集(约140万行),我正在对其进行拆分和汇总。整个过程需要一段时间才能运行,而我的最终应用程序依赖于频繁运行,因此我的想法是使用
doMC
和带有plyr的
.parallel=TRUE
标志,就像这样(简化了一点):

这是我第一次涉足多核R计算,所以如果有更好的方法来思考这个问题,我愿意接受建议


更新:与生活中的许多事情一样,事实证明我在代码的其他地方做了其他愚蠢的事情,而在这个特定的例子中,整个多处理问题变得毫无意义。然而,对于大数据折叠任务,我会记住
data.table
。我能够以一种简单的方式复制我的折叠任务。

我认为plyr不会复制整个数据集。但是,在处理数据块时,该子集将复制到辅助对象。因此,当使用更多的worker时,内存中同时存在更多的子集(即8而不是2)

我可以想出一些你可以尝试的技巧:

  • 将数据放入数组结构而不是data.frame,并使用adply进行汇总。阵列在内存使用和速度方面效率更高。我的意思是使用正规矩阵,而不是大矩阵
  • 尝试一下
    data.table
    ,在某些情况下,这会导致速度提高几个数量级。我不确定data.table是否支持并行处理,但即使没有并行化,data.table也可能快几百倍。请参阅比较
    ave
    ddply
    data.table
    ,了解数据块的处理
我想我会留下必要的注释,让您参考data.table包,它通常在这类事情上要快得多。您真的有8个内核吗?或者更确切地说是一个具有4核和4“超读”核的英特尔?我有一个在MPICH(不是R)下运行的应用程序,它可以在50%的CPU下很好地扩展到4个,但是在8个内核被请求时运行速度要慢得多,并提供100%的CPU。我将检查数据。表。。。当人们马上想到一个项目时,听起来很有希望。是的,我的CPU是4核,带有HT。我耗尽了内存,开始在2以上进行交换,但听起来我可能不想使用所有8个“核心”,即使我可以解决内存问题。谢谢你的提醒!我有类似的问题,与“8”核心。你可能想看看那篇博文。您正在比较的三个函数似乎在执行不同的任务:据我所知,其中只有一个函数在计算平均值。谢谢,我来看看!我怀疑这不会改变帖子的结果,也就是说data.table的速度要快得多。
library(plyr)
require(doMC)
registerDoMC()

df <- ddply(df, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE)
library(plyr)
library(doMC)
registerDoMC()
library(bigmemory)

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