【发布时间】:2016-07-02 06:22:21
【问题描述】:
我正在尝试使用 data.table 运行并行计算。我有一个大数据集,我想独立并并行地处理每组主题。
令:DataP是一个大数据集:ID、x1、x2、x3、组
我的代码是:
# Data preparations
# I split an index (indx) because data split takes a lot of time with my data.
setkey(DataP ,SplitKey_f)
indx<-split(seq(nrow(DataP )),DataP $group)
l<-length(unique(DataP$group))
library(parallel)
library(doParallel)
library(foreach)
cl<-makeCluster(8)
registerDoParallel(cl)
foreach(i=1:l, .combine = rbind) %dopar% {
library(data.table)
Psubset<-DataP [,indx[[i]]]
# some transformations on the data
}
stopCluster(cl)
以上行不通,因为并行计算的foreach无法执行该行:
Psubset
但是,%do% 而不是 %dopar% 效果很好(但需要很多时间)。
如何解决问题 - 在并行循环中快速子设置 data.table?
【问题讨论】:
-
data.table并不真正支持并行计算。它的引用机制在并行计算中并不能很好地发挥作用。您进行并行化的原因是您调用了一个非常耗时的函数within data.table,最好不使用data.table。但是,您似乎并非如此(“对数据进行一些转换”)。我怀疑您的实际问题是您并没有真正很好地利用 data.table 。 (我还注意到你没有分配foreach循环,这表明你没有很好地理解foreach。) -
您应该描述(包括一个可重现的示例)您实际尝试实现的目标,以便人们可以建议改进您的 data.table 代码,而无需并行化。
-
为什么是
Psubset<-DataP [,indx[[i]]]而不是Psubset<-DataP[indx[[i]],]?您是在尝试拆分行而不是列,对吗? -
有一个新的
split.data.table方法即将推出,它比您当前使用的split更快。缺乏可重复的示例会阻止许多人发布答案,请注意这一点。如果您对块的操作可以独立进行,您可以使用big.data.table,请点击 David 评论中的链接。
标签: r foreach split data.table