我想将多个(最多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)
但是,这会产生一个模糊的错误:
Error in
checkForRemoteErrors(val)
:
2 nodes produced errors; first error: Internal error, please report (including result ofsessionInfo()
) to datatable-help: oldtncol (0) < oldncol (1) but tl of class is marked.
我想这是由于参考作业的分配方式.在每个线程上都会进行分配,但这不会在全局环境中传回DT.
是否无法并行向data.table添加列?
最佳答案 以下适用于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 = 100user system elapsed
1.172 2.756 41.707NN = 100
JJ = 2000user system elapsed
4.060 11.152 24.101NN = 1000
JJ = 2000user system elapsed
6.580 15.712 139.967
建议
我使用这样的东西来获得2M列和600行
(仍然不是最佳的),希望它符合您的要求
system.time(
DT2 <- as.data.table(matrix(rnorm(NN*JJ), ncol = JJ))
)