繁体   English   中英

并行组合进度条和过程

[英]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函数的后端,而doParalleldoSNOWdoMC则不支持。 这些后端不会立即调用组合,因为它们是使用诸如clusterApplyLBmclapply函数实现的,这些函数不支持钩子,以允许在返回任务时执行用户提供的代码。

因为我看到了对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM