7

我有一个相当大的数据集(~1.4m 行),我正在对其进行拆分和总结。整个事情需要一段时间才能运行,而我的最终应用程序取决于频繁运行,所以我的想法是像这样使用 plyrdoMC.parallel=TRUE标志(简化一点):

library(plyr)
require(doMC)
registerDoMC()

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

如果我将内核数明确设置为两个(使用registerDoMC(cores=2)),我的 8 GB RAM 可以让我看透,并且可以节省大量时间。但是,如果我让它使用所有 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)

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

更新:与生活中的许多事情一样,事实证明我在代码的其他地方做了其他愚蠢的事情,并且在这个特定实例中,多处理的整个问题成为一个有争议的问题。但是,对于大数据折叠任务,我会data.table记住。我能够以一种直接的方式复制我的折叠任务。

4

1 回答 1

6

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

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

  • 将您的数据放入数组结构而不是 data.frame 并使用 adply 进行汇总。数组在内存使用和速度方面效率更高。我的意思是使用普通矩阵,而不是 big.matrix。
  • 试一试data.table,在某些情况下,这可以导致速度提高几个数量级。我不确定 data.table 是否支持并行处理,但即使没有并行化,data.table 也可能快数百倍。请参阅我的博客文章比较aveddply以及data.table处理数据块。
于 2011-12-29T15:31:48.977 回答