我正在使用parallel
包在几个节点上对我的计算进行分析。每个原子作业都是基于data.table
目前的解决方案如下:
library(parallel)
cluster_size = max(1, detectCores() - 1)
cl = makeCluster(cluster_size)
clusterExport(cl, c("dt"))
n_jobs = length(unique(dt$id))
job = function(i) {
my_data = dt[id == i] #a few rows will correspond to a single job 'piece'
res = do_calculations(my_data)
return(res)
}
res = clusterApplyLB(cl, n_jobs, job)
res = rbindlist(res)
stopCluster(cl)
这会将所有数据发送给每个从属设备,这会因为传输而浪费内存和速度。
如果我事先不知道哪个从服务器将执行哪一个(必须进行负载平衡),我怎样才能优化它以仅将data.table
的所需子集发送给从服务器?
答案 0 :(得分:0)
为了仅向工作人员发送所需数据,您应该创建dt
子集列表,并使用clusterApplyLB
迭代该列表。例如:
ids = sort(unique(dt$id))
job = function(my_data) {
do_calculations(my_data)
}
res = clusterApplyLB(cl, lapply(ids, function(i) dt[id == i]), job)
现在您不会将dt
导出到工作人员,因为主人正在创建子集而不是工人。