我使用parSapply函数在并行环境中运行一个模拟,下面是我的代码:
runpar <- function(i) MonteCarloKfun(i=i)
# Detect number of cores available
ncores <- detectCores(logical=TRUE)
# Set up parallel environment
cl <- makeCluster(ncores, methods=FALSE)
# Export objects to parallel environment
clusterSetRNGStream(cl,1234567) # not necessary since we do not sample
clusterExport(cl, c("kfunctions","frq","dvec","case","control","polygon", "MonteCarloKfun", "khat",
"as.points", "secal"))
# For 1 parameter use parSapply
outpar <- parSapply(cl,i,runpar)
# close parallel environment
stopCluster(cl)
有没有人知道是否有可能在parSapply函数中添加进度条,理想情况下,我希望类似于pbapply库中的pbapply。
2条答案
按热度按时间d8tt03nd1#
parSapply
函数不支持进度条,我不认为有任何真正好的方法可以通过向任务函数添加额外的代码来实现进度条,尽管人们已经做出了勇敢的努力。doSNOW
包支持进度条,所以你既可以直接使用它,也可以编写一个类似于parSapply
函数的 Package 器函数。您可以轻松地修改此函数以使用
tkProgressBar
或winProgressBar
函数。下面是
pbSapply
的使用示例:请注意,它没有使用预调度,因此如果任务比较小,性能就不如
parSapply
。7gcisfzg2#
您可以使用
parabar
软件包来实现这一点。免责声明:我是软件包的作者。可以在交互式
R
会话中使用该包,如下所示。如果你需要更大的灵活性(例如,当构建一个
R
包时),还有一个基于R6
类的低级API。下面是一个建议的工作流,它可能符合Steve Weston的"勇敢的努力"的特征,但是,通过一些开销,它完成了我主要感兴趣的东西,即:(1)跨平台解决方案,(2)不使用低级别的
parallel
实现细节,以及(3)关于所使用的依赖关系是节俭的。简而言之,下面的代码执行以下操作:
prepare_file_for_logging
创建稍后将用于报告和跟踪并行任务执行的进度的临时文件(即,OS
特定位置)。par_sapply_with_progress
在后台启动R
会话(即,不阻塞主会话)。PSOCK
或FORK
),并通过函数parallel::parSapply
并行运行任务。track_progress
监视临时文件,并根据其内容显示和更新进度条。使用的库是
parallel
和callr
,以及base
和utils
中的一些其他函数。为了清楚起见,下面的代码被显式注解。用法
实施
准备临时文件的函数
并行运行任务的函数
跟踪进度的函数
要考虑的事情
关于从临时文件中记录和读取进度,我可以想到两种方法来减少开销:
track_progress
是连续扫描临时文件并更新进度条,但这可能不是必须的,也许更好的方法是在后续文件扫描和进度条更新之间设置一个超时。最后,我个人更喜欢打开一个集群,然后在代码的不同部分重用它,在这个场景中,我会从
callr::r_bg
(即短暂的后台R
进程)切换到callr::r_session
(即永久的R
会话)以获得更多的控制(也就是,参见this question)。我希望这对其他在这个问题上挣扎的人也有帮助。