Aşağıda, bir MWE sorunum var: Önyükleme kullanarak bazı işlevler için bir ilerleme çubuğu programladım (önyükleme paketinden önyükleme işleviyle).txtProgressBar paralel önyükleme için düzgün görüntülenmiyor
Paralel işleme kullanmadığım sürece bu iyi çalışır (res_1core
aşağıda). Paralel işlemeyi parallel = "multicore"
ve olarak ayarlayarak kullanmak istiyorsam, ilerleme çubuğu düzgün görüntülenmiyor (res_2core
aşağıda).
library(boot)
rsq <- function(formula, data, R, parallel = c("no", "multicore", "snow"), ncpus = 1) {
env <- environment()
counter <- 0
progbar <- txtProgressBar(min = 0, max = R, style = 3)
bootfun <- function(formula, data, indices) {
d <- data[indices,]
fit <- lm(formula, data = d)
curVal <- get("counter", envir = env)
assign("counter", curVal + 1, envir = env)
setTxtProgressBar(get("progbar", envir = env), curVal + 1)
return(summary(fit)$r.square)
}
res <- boot(data = data, statistic = bootfun, R = R, formula = formula, parallel = parallel, ncpus = ncpus)
return(res)
}
res_1core <- rsq(mpg ~ wt + disp, data = mtcars, R = 1000)
res_2core <- rsq(mpg ~ wt + disp, data = mtcars, R = 1000, parallel = "multicore", ncpus = 2)
bu çizme fonksiyonu Çok işlem için tek çekirdekli işleme lapply
ve mclapply
çağrısı olmasından ile ilişkili olduğunu okumak. Bununla başa çıkmak için kolay bir çözüm bilen var mı? Yani, tüm paralel süreçleri dikkate alarak ilerlemeyi göstermek istiyorum.
Güncelleme Karolis Koncevičius girişine
teşekkürler, ben bir çözüm (aşağıda sadece kullanmak güncellenen rsq
fonksiyonu) bulduk: Maalesef
rsq <- function(formula, data, R, parallel = c("no", "multicore", "snow"), ncpus = 1) {
bootfun <- function(formula, data, indices) {
d <- data[indices,]
fit <- lm(formula, data = d)
return(summary(fit)$r.square)
}
env <- environment()
counter <- 0
progbar <- txtProgressBar(min = 0, max = R, style = 3)
flush.console()
intfun <- function(formula, data, indices) {
curVal <- get("counter", envir = env) + ncpus
assign("counter", curVal, envir = env)
setTxtProgressBar(get("progbar", envir = env), curVal)
bootfun(formula, data, indices)
}
res <- boot(data = data, statistic = intfun, R = R, formula = formula, parallel = parallel, ncpus = ncpus)
return(res)
}
, çok çekirdekli işleme zaman için bu sadece çalışır Terminalden R'yi çalıştırıyorum. R konsolu ya da Rstudio'da bu şekilde nasıl ekleyeceğinize dair herhangi bir fikir var mı?
Bunun bu kadar zor olduğunu şaşırtıcı değil - tek tek işçilerden ilerleme mesaj almak bir tür 'dinleyici' kurmak zorundayız ... –
İlişkin '' paralel '' çok çekirdekli '' önyükleme '' olarak adlandırılan 'mclapply':“ Bu işlevleri GUI veya gömülü ortamlarda kullanmak kesinlikle tavsiye edilmez, çünkü aynı GUI'yi paylaşan çeşitli süreçlere yol açar ve bu da muhtemelen kaosa neden olur (ve muhtemelen çöker). https://stat.ethz.ch/R-manual/R-devel/library/parallel/html/mclapply.html – Thomas
Teşekkürler! Bu öneriyi daha önce okumamıştım. – johansteen