如何在R中显示并行计算中代码的进度?
How to show the progress of code in parallel computation in R?
我现在正在处理一个大型数据集,某些函数可能需要几个小时才能处理。我想知道如何通过进度条或数字(1,2,3,...,100)来显示代码的进度。我想将结果存储为包含两列的数据框。这是一个例子。谢谢
require(foreach)
require(doParallel)
require(Kendall)
cores=detectCores()
cl <- makeCluster(cores-1)
registerDoParallel(cl)
mydata=matrix(rnorm(8000*500),ncol = 500)
result=as.data.frame(matrix(nrow = 8000,ncol = 2))
pb <- txtProgressBar(min = 1, max = 8000, style = 3)
foreach(i=1:8000,.packages = "Kendall",.combine = rbind) %dopar%
{
abc=MannKendall(mydata[i,])
result[i,1]=abc$tau
result[i,2]=abc$sl
setTxtProgressBar(pb, i)
}
close(pb)
stopCluster(cl)
但是,当我 运行 代码时,我没有看到任何进度条出现,结果不正确。有什么建议吗?谢谢
doSNOW 包支持进度条,而 doParallel 不支持。这是在您的示例中放置进度条的方法:
require(doSNOW)
require(Kendall)
cores <- parallel::detectCores()
cl <- makeSOCKcluster(cores)
registerDoSNOW(cl)
mydata <- matrix(rnorm(8000*500), ncol=500)
pb <- txtProgressBar(min=1, max=8000, style=3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress=progress)
result <-
foreach(i=1:8000, .packages="Kendall", .options.snow=opts,
.combine='rbind') %dopar% {
abc <- MannKendall(mydata[i,])
data.frame(tau=abc$tau, sl=abc$sl)
}
close(pb)
stopCluster(cl)
我认为 pbapply 包也能完成这项工作。
require(parallel)
require(pbapply)
mydata=matrix(rnorm(8000*500),ncol = 500)
cores=detectCores()
cl <- makeCluster(cores-1)
parallel::clusterExport(cl= cl,varlist = c("mydata"))
parallel::clusterEvalQ(cl= cl,library(Kendall))
result = pblapply(cl = cl,
X = 1:8000,
FUN = function(i){
abc=MannKendall(mydata[i,])
result = as.data.frame(matrix(nrow = 1,ncol = 2))
result[1,1]=abc$tau
result[1,2]=abc$sl
return(result)
})
result = dplyr::bind_rows(result)
stopCluster(cl)
根据文档,如果套接字集群是通过 cl
提供的,那么它会调用 parLapply()
Parallel processing can be enabled through the cl argument. parLapply is called when cl is a
’cluster’ object, mclapply is called when cl is an integer.
我现在正在处理一个大型数据集,某些函数可能需要几个小时才能处理。我想知道如何通过进度条或数字(1,2,3,...,100)来显示代码的进度。我想将结果存储为包含两列的数据框。这是一个例子。谢谢
require(foreach)
require(doParallel)
require(Kendall)
cores=detectCores()
cl <- makeCluster(cores-1)
registerDoParallel(cl)
mydata=matrix(rnorm(8000*500),ncol = 500)
result=as.data.frame(matrix(nrow = 8000,ncol = 2))
pb <- txtProgressBar(min = 1, max = 8000, style = 3)
foreach(i=1:8000,.packages = "Kendall",.combine = rbind) %dopar%
{
abc=MannKendall(mydata[i,])
result[i,1]=abc$tau
result[i,2]=abc$sl
setTxtProgressBar(pb, i)
}
close(pb)
stopCluster(cl)
但是,当我 运行 代码时,我没有看到任何进度条出现,结果不正确。有什么建议吗?谢谢
doSNOW 包支持进度条,而 doParallel 不支持。这是在您的示例中放置进度条的方法:
require(doSNOW)
require(Kendall)
cores <- parallel::detectCores()
cl <- makeSOCKcluster(cores)
registerDoSNOW(cl)
mydata <- matrix(rnorm(8000*500), ncol=500)
pb <- txtProgressBar(min=1, max=8000, style=3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress=progress)
result <-
foreach(i=1:8000, .packages="Kendall", .options.snow=opts,
.combine='rbind') %dopar% {
abc <- MannKendall(mydata[i,])
data.frame(tau=abc$tau, sl=abc$sl)
}
close(pb)
stopCluster(cl)
我认为 pbapply 包也能完成这项工作。
require(parallel)
require(pbapply)
mydata=matrix(rnorm(8000*500),ncol = 500)
cores=detectCores()
cl <- makeCluster(cores-1)
parallel::clusterExport(cl= cl,varlist = c("mydata"))
parallel::clusterEvalQ(cl= cl,library(Kendall))
result = pblapply(cl = cl,
X = 1:8000,
FUN = function(i){
abc=MannKendall(mydata[i,])
result = as.data.frame(matrix(nrow = 1,ncol = 2))
result[1,1]=abc$tau
result[1,2]=abc$sl
return(result)
})
result = dplyr::bind_rows(result)
stopCluster(cl)
根据文档,如果套接字集群是通过 cl
提供的,那么它会调用 parLapply()
Parallel processing can be enabled through the cl argument. parLapply is called when cl is a ’cluster’ object, mclapply is called when cl is an integer.