我已经尝试了相当长的一段时间来并行化这段代码,但无济于事。我要么出错,要么什么都不工作。有人有什么想法吗?
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
1条答案
按热度按时间velaa5lx1#
你的例子是不可复制的,例如。
DTM_to_use
没有定义,这使得除了“以下应该工作”的建议之外很难提供帮助:plyr::ldply(x)
函数接受参数.parallel = TRUE
,它将分块处理x
,并将其分发给任意数量的worker。这在内部使用foreach框架进行并行处理。这样你就可以使用任何“do”包了。下面是一个使用未来后端的示例:既然您提到HPC是您的目标:如果您有一个没有作业调度程序的ad-hoc群集,但您可以通过SSH连接到每个节点,则可以用途:
在
node1
和node3
上各运行一个内核,在node2
上运行两个内核。如果你有一个真实的的作业调度器,比如SGE,那么你可以用途:并且
sequ
中的每个元素将作为队列上的单个作业来处理(这实际上对应于具有无限数量的工作者)。如果你想把它分成块,你可以限制工人的数量,例如:无论使用什么样的后端,脚本看起来都是一样的。
编辑2023-05-30:(虚拟)未来的后端
multiprocess
已经不复存在,取而代之的是multisession
和multicore
。更新示例以使用plan(multisession)
。