我有一个相当大的数据集(~1.4m行),我正在对其进行拆分和总结。整个过程需要一段时间才能运行,我的最后一个应用程序取决于频繁运行,所以我的想法是使用doMC和.parallel=TRUE标志,类似于plyr (稍微简化了一点):
library(plyr)
require(doMC)
registerDoMC()
df <- ddply(df, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE)如果我将内核的数量显式地设置为两个(使用registerDoMC(cores=2)),我的8GB内存就能让我通过,这就节省了相当长的时间。但是,如果让它使用所有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计算,所以如果有更好的思考方法,我愿意接受建议。
更新:和生活中的许多事情一样,我在代码的其他地方做了其他愚蠢的事情,在这个特定的例子中,整个多处理的问题变得毫无意义。但是,对于大数据折叠任务,我将记住data.table。我能够以一种简单的方式复制我的折叠任务。
发布于 2011-12-29 15:31:48
我不认为plyr会复制整个数据集。但是,在处理数据块时,会将该子集复制到工作人员。因此,当使用更多的工作人员时,更多的子集同时在内存中(即8而不是2)。
我能想到一些你可以尝试的小窍门:
data.table一个尝试,在某些情况下,这可能导致几个数量级的速度增长。我不确定data.table是否支持并行处理,但即使没有并行化,data.table也可能比以前快一倍。请参见比较我的博客文章、ave、ddply和data.table来处理大块数据。https://stackoverflow.com/questions/8669345
复制相似问题