使用Parallel包在负载平衡情况下仅向从站发送所需的数据子集

时间:2015-08-17 15:51:16

标签: r parallel-processing data.table

我正在使用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的所需子集发送给从服务器?

1 个答案:

答案 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导出到工作人员,因为主人正在创建子集而不是工人。