Gab*_*yLP 2 parallel-processing r function progress-bar
我在将要并行运行的过程与进度条的创建结合起来时遇到了问题。
我的流程代码是:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
我结合了我的代码和来自这里的代码
但没有编译。我收到语法错误,但找不到。
我试过这个其他代码:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
但我也收到错误。
您尝试使用的方法可能在某些情况下有效,但这不是一个好的通用解决方案。我想要做的是在主进程(foreach循环外)中创建一个进度条,然后foreach在返回任务时更新该进度条。不幸的是,没有一个后端支持这一点。这有可能是使用组合函数的技巧做,但只有当你使用一个后台支持,呼吁即时,该功能结合起来doParallel,doSNOW并doMC没有。这些后端不会即时调用 combine ,因为它们是使用诸如clusterApplyLB和 之类的函数实现的,这些函数mclapply不支持钩子以允许在任务返回时执行用户提供的代码。
因为我在 中看到了对进度条支持的兴趣foreach,所以我修改了doSNOW包以添加对特定于 doSNOW 的“进度”选项的支持,并将代码检查到 R-Forge 网站。它利用了snow包中的一些较低级别的函数,不幸的是这些函数没有被parallel包导出。
如果您想试用这个新功能,您需要doSNOW从 R-Forge安装。我使用以下命令在 MacBook Pro 上执行此操作:
install.packages("doSNOW", repos="http://R-Forge.R-project.org", type="source")
Run Code Online (Sandbox Code Playgroud)
这是一个简单的示例脚本,演示了实验性的“进程”选项:
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)
}
Run Code Online (Sandbox Code Playgroud)
更新
该progress选项现在在 CRAN 上最新版本的 doSNOW 中可用。