我有一个相当大的数据集(~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
记住。我能够以一种直接的方式复制我的折叠任务。