R -并行化ldply和replicate函数

c3frrgcw  于 2023-06-03  发布在  其他
关注(0)|答案(1)|浏览(128)

我已经尝试了相当长的一段时间来并行化这段代码,但无济于事。我要么出错,要么什么都不工作。有人有什么想法吗?

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)

它需要很长时间才能像现在这样运行。先谢谢你。
我试着用这个例子作为replicate的一个并行版本-但是,我有很多错误:https://stackoverflow.com/a/19281611/8598566

velaa5lx

velaa5lx1#

你的例子是不可复制的,例如。DTM_to_use没有定义,这使得除了“以下应该工作”的建议之外很难提供帮助:
plyr::ldply(x)函数接受参数.parallel = TRUE,它将分块处理x,并将其分发给任意数量的worker。这在内部使用foreach框架进行并行处理。这样你就可以使用任何“do”包了。下面是一个使用未来后端的示例:

library("doFuture")
registerDoFuture()

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

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是您的目标:如果您有一个没有作业调度程序的ad-hoc群集,但您可以通过SSH连接到每个节点,则可以用途:

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

node1node3上各运行一个内核,在node2上运行两个内核。如果你有一个真实的的作业调度器,比如SGE,那么你可以用途:

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

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

plan(batchtools_sge, workers = 200)

无论使用什么样的后端,脚本看起来都是一样的。
编辑2023-05-30:(虚拟)未来的后端multiprocess已经不复存在,取而代之的是multisessionmulticore。更新示例以使用plan(multisession)

相关问题