使用plyr,doMC和summarize()与非常大的数据集?

Pet*_*ter 7 r plyr data.table

我有一个相当大的数据集(约1.4米行),我正在做一些拆分和总结.整个过程需要一段时间才能运行,我的最终应用程序依赖于频​​繁运行,所以我的想法是使用doMC.parallel=TRUEplyr 的标志一样(简化了一点):

library(plyr)
require(doMC)
registerDoMC()

df <- ddply(df, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE)
Run Code Online (Sandbox Code Playgroud)

如果我明确地将内核数量设置为2(使用registerDoMC(cores=2)),我的8 GB内存就可以看到我,并且它可以节省相当多的时间.但是,如果我让它使用所有8个内核,由于每个分叉进程似乎克隆了内存中的整个数据集,我很快就会耗尽内存.

我的问题是,是否有可能以更节省内存的方式使用plyr的并行执行工具?我尝试将我的数据帧转换为a 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)
Run Code Online (Sandbox Code Playgroud)

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

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

Pau*_*tra 6

我认为plyr不会复制整个数据集.但是,在处理大量数据时,该子集将复制到工作程序.因此,当使用更多工作者时,更多子集同时存在于内存中(即8个而不是2个).

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

  • 将数据放入数组结构而不是data.frame,并使用adply进行汇总.数组在内存使用和速度方面更有效.我的意思是使用普通矩阵,而不是big.matrix.
  • data.table一个尝试,在某些情况下,这可能会导致的几个数量级的速度增长.我不确定data.table是否支持并行处理,但即使没有并行化,data.table可能会快几倍.查看我的博客文章比较ave,ddply以及data.table处理数据块.