[英]do parallel combine progress bar and process
我在合并要并行运行的流程和创建进度条时遇到问题。
我的代码是:
pred_pnn <- function(x, nn){
xlst <- split(x, 1:nrow(x))
pred <- foreach(i = xlst,.packages = c('tcltk', 'foreach'), .combine = rbind)
%dopar%
{ mypb <- tkProgressBar(title = "R progress bar", label = "",
min = 0, max = max(jSeq), initial = 0, width = 300)
foreach(j = jSeq) %do% {Sys.sleep(.1)
setTkProgressBar(mypb, j, title = "pb", label = NULL)
}
library(pnn)
data.frame(prob = guess(nn, as.matrix(i))$probabilities[1], row.names = NULL)
}
}
我结合了我的代码和这里的代码
但没有编译。 我收到语法错误,但是找不到。
我尝试了其他代码:
pred_pnn <- function(x, nn){
xlst <- split(x, 1:nrow(x))
pred <- foreach(i = xlst, .combine = rbind) %dopar%
{library(pnn)
cat(i, '\n')
data.frame(prob = guess(nn, as.matrix(i))$probabilities[1], row.names = NULL)
}
}
但是我也得到一个错误。
您尝试使用的方法可能在某些情况下可行,但这不是一个好的通用解决方案。 我想做的是在主流程中(在foreach
循环之外)创建一个进度条,然后让foreach
在返回任务时更新该进度条。 不幸的是,没有后端支持。 可以使用Combine函数技巧来做到这一点,但doParallel
是您使用的是支持即时调用doParallel
函数的后端,而doParallel
, doSNOW
和doMC
则不支持。 这些后端不会立即调用组合,因为它们是使用诸如clusterApplyLB
和mclapply
函数实现的,这些函数不支持钩子,以允许在返回任务时执行用户提供的代码。
因为我看到了对foreach
中进度条支持的兴趣,所以我修改了doSNOW
包以添加对doSNOW特定的“ progress”选项的支持,然后将代码签入R-Forge网站。 它利用了snow
软件包中的一些较低级别的函数,不幸的是, parallel
软件包没有导出这些函数。
如果要尝试此新功能,则需要从R-Forge安装doSNOW
。 我在MacBook Pro上使用以下命令执行了此操作:
install.packages("doSNOW", repos="http://R-Forge.R-project.org", type="source")
这是一个简单的示例脚本,演示了实验性的“ progess”选项:
library(doSNOW)
library(tcltk)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)
pb <- tkProgressBar(max=100)
progress <- function(n) setTkProgressBar(pb, n)
opts <- list(progress=progress)
r <- foreach(i=1:100, .options.snow=opts) %dopar% {
Sys.sleep(1)
sqrt(i)
}
更新资料
现在,在CRAN的最新版本的doSNOW中提供了progress
选项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.