我有一个相当大的数据集(约1.4米行),我正在做一些拆分和总结.整个过程需要一段时间才能运行,我的最终应用程序依赖于频繁运行,所以我的想法是使用doMC
和.parallel=TRUE
plyr 的标志一样(简化了一点):
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
记住.我能够以一种简单的方式复制我的折叠任务.
我认为plyr不会复制整个数据集.但是,在处理大量数据时,该子集将复制到工作程序.因此,当使用更多工作者时,更多子集同时存在于内存中(即8个而不是2个).
我可以想到你可以尝试的一些技巧:
data.table
一个尝试,在某些情况下,这可能会导致的几个数量级的速度增长.我不确定data.table是否支持并行处理,但即使没有并行化,data.table可能会快几倍.查看我的博客文章比较ave
,ddply
以及data.table
处理数据块.