Я пытаюсь написать функцию с возможностью параллельных вычислений. Чтобы заставить его работать как в средах windows, так и в среде ma c или Linux, я использую систему PSOCK, которая, на мой взгляд, является конфигурацией по умолчанию в makeCluster()
. Мой вопрос заключается в том, должен ли я или более желательно передать все аргументы в кластеры с помощью функции clusterExport
. Если я сделаю это, я думаю, что мне нужно оценить все входные аргументы - вместо ленивых вычислений по умолчанию. Если некоторые переменные используются только в некоторых особых случаях, это не представляется желательным.
Например, в следующем коде мне интересно, следует ли мне добавить clusterExport(varlist = c("a","b","c"),cl = cl,envir = environment())
в функцию. Следующий код прекрасно работает на моем компьютере, но подобный код не сработал на другом компьютере.
Мне было бы очень интересно услышать о наилучшей практике. Спасибо!
library(pbapply)
foo = function(a=3, b=4, c=5, B = 8, parallel = FALSE){
if(parallel) {cl = makeCluster(4) } else{cl = NULL}
# default a,b,c values are desired to be used
if(a>5){
# c is used only in this case
v= pbsapply(1:B,FUN = function(i) {Sys.sleep(.5); a+b+c+i},cl = cl)
}else{
v= pbsapply(1:B,FUN = function(i) {Sys.sleep(.5); a+b+i},cl = cl)
}
if(parallel) stopCluster(cl)
return(v)
}
system.time(foo())
system.time(foo(parallel = T))