R - 并行化ldply和复制函数

时间:2017-09-12 15:55:40

标签: r parallel-processing

我已经尝试了很长时间来并行化这段代码,但无济于事。我要么得到错误,要么无效。有人有什么想法吗?

cal_Ops <- function(n, dtm, ratio = 0.1) {
  print(n)
  selVect <- sample(nrow(dtm), nrow(dtm) * ratio)
  holdout <- dtm[selVect,]
  training <- dtm[-selVect,]
  topModel <- LDA(training, n, control = list(estimate.alpha = FALSE))
  return(c(n, perplexity(topModel, holdout), as.numeric(logLik(topModel))))
}

require(plyr)

replication <- 1000

sequ <-seq(5,100,5)

perplex <- ldply(sequ, function(x, dtm) {
   t(replicate(replication, cal_Ops(x, dtm))) } , dtm = DTM_to_use)

按原样运行需要很长时间。提前谢谢你。

我尝试将此示例用作复制的并行版本 - 但是,我有很多错误: https://stackoverflow.com/a/19281611/8598566

1 个答案:

答案 0 :(得分:1)

您的示例不可重复,例如DTM_to_use未定义,除了“以下应该工作”的建议外,很难提供帮助:

plyr::ldply(x)函数接受参数.parallel = TRUE,它将处理分配给您拥有的任意数量工作人员的块中的x。这在内部使用foreach框架进行并行处理。有了它,你可以使用任何“做”包。以下是使用未来后端的示例:

library("doFuture")
registerDoFuture()

## Utilize all cores available to this R session
plan(multiprocess)

replication <- 1000
sequ <-seq(from = 5, to = 100, by = 5)
perplex <- plyr::ldply(sequ, function(x) {
   t(replicate(replication, c(a = x, b = sqrt(x))))
}, .parallel = TRUE)

str(perplex)
'data.frame':   20000 obs. of  2 variables:
 $ a: num  5 5 5 5 5 5 5 5 5 5 ...
 $ b: num  2.24 2.24 2.24 2.24 2.24 ...

由于您提到HPC是您的目标:如果您有一个没有作业调度程序的临时群集,但您可以通过SSH连接到每个节点,那么您可以使用:

plan(cluster, workers = c("node1", "node2", "node2", "node3"))

node1node3以及node2上的两个核心上分别运行一个核心。如果您确实有一个真正的作业调度程序,比如SGE,那么您可以使用:

library("future.batchtools")
plan(batchtools_sge)

并且sequ中的每个元素将作为队列中的单个作业处理(实际上对应于具有无限数量的工作者)。如果你想把它组合起来,你可以限制工人数量(=工作),例如

plan(batchtools_sge, workers = 200)

无论后端使用什么,您的脚本都会看起来相同。