将列并行分配给data.table

时间:2017-01-28 01:42:56

标签: r parallel-processing data.table parallel-foreach

我想将多个(最多2000+)列分配给data.table;这个过程让我感到非常可以并行化,但似乎通过将同一个data.table分发给许多工作人员来处理这个过程。

我期望以下工作:

library(data.table)
library(parallel)

NN = 100
JJ = 100

cl = makeCluster(2)
DT = data.table(seq_len(NN))
alloc.col(DT, 1.5*JJ)

clusterExport(cl, c("DT", "NN", "JJ"))
clusterEvalQ(cl, library(data.table))

parLapply(cl, seq_len(JJ), function(jj) {
  set(DT, , paste0("V", jj), rnorm(NN))
})

stopCluster(cl)

然而,这会产生一个模糊的错误:

  

checkForRemoteErrors(val)中的错误:     2个节点产生错误;第一个错误:内部错误,请向datatable-help报告(包括sessionInfo()的结果):oldtncol(0)< oldncol(1)但是标记了tl。

我想这是由于参考作业的分配方式。在每个线程上都会进行分配,但这不会在全局环境中传回DT

是否无法并行向data.table添加列?

1 个答案:

答案 0 :(得分:1)

以下适用于Linux(Ubuntu 16.04)。 (注意:mcapply不能在Windows上工作) 我有兴趣了解这是否更快

> DT <- do.call("cbind",
               mclapply(seq_len(JJ), function(jj) {
  set(DT, , paste0("V", jj), rnorm(NN))
}, mc.cores = detectCores()))

效果

在12核上运行

  

NN = 100000
  JJ = 100

     

用户系统已用     1.172 2.756 41.707

     

NN = 100
    JJ = 2000

     

用户系统已用     4.060 11.152 24.101

     

NN = 1000
    JJ = 2000

     

用户系统已用     6.580 15.712 139.967

建议

我使用这样的东西来获得2M列和600行 (仍然不是最佳的),希望它符合您的要求

system.time(
  DT2 <- as.data.table(matrix(rnorm(NN*JJ), ncol = JJ))
)