gpt4 book ai didi

r - 并行组合进度条和进程

转载 作者:行者123 更新时间:2023-12-02 21:20:12 24 4
gpt4 key购买 nike

我在将要并行运行的进程与进度条的创建结合起来时遇到问题。

我的流程代码是:

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)
}
}

我将我的代码与 here 中的代码结合起来。

但没有编译。我收到语法错误,但找不到它。

我尝试了其他代码:

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 在任务返回时更新该进度条。不幸的是,没有一个后端支持这一点。可以使用组合函数技巧来做到这一点,但前提是您使用的后端支持动态调用组合函数,其中 doParalleldoSNOWdoMC 没有。这些后端不会动态调用组合,因为它们是使用 clusterApplyLBmclapply 等函数实现的,这些函数不支持允许执行用户提供的代码的钩子(Hook)当任务返回时。

因为我发现 foreach 对进度条支持很感兴趣,所以我修改了 doSNOW 包以添加对 doSNOW 特定的“进度”选项的支持,并且我在 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)
}

更新

progress 选项现已在 CRAN 上最新版本的 doSNOW 中提供。

关于r - 并行组合进度条和进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28222236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com