parallel - parlapply example in r
No se pudo encontrar la funciĆ³n dentro del bucle foreach (3)
Así que puedo reproducir esto, para los curiosos:
require(doSNOW)
registerDoSNOW(makeCluster(5, type="SOCK"))
getDoParWorkers()
getDoParName()
getDoParVersion()
fib <- function(n) {
if (n <= 1) { return(1) }
return(fib(n-1) + fib(n-2))
}
my.matrix <- matrix(runif(2500, 10, 50), nrow=50)
calcLotsaFibs <- function() {
result <- foreach(row.num=1:nrow(my.matrix), .export=c("fib", "my.matrix")) %dopar% {
return(Vectorize(fib)(my.matrix[row.num,]))
}
return(result)
}
lotsa.fibs <- calcLotsaFibs()
He podido evitar esto poniendo la función en otro archivo y cargando ese archivo en el cuerpo del foreach. Obviamente, también podría mover la definición de la función al cuerpo del propio foreach.
[EDITAR - He sugerido anteriormente que tal vez .export no funciona correctamente con los nombres de funciones, pero se corrigió a continuación.]
Estoy tratando de usar foreach para hacer computación multinúcleo en R.
A <-function(....) {
foreach(i=1:10) %dopar% {
B()
}
}
Entonces llamo a la función A
en la consola. El problema es que estoy llamando a una función Posdef
dentro de B
que está definida en otro archivo de script que yo fuente. Tuve que poner a Posdef
en la lista de argumentos de exportación de foreach
: .export=c("Posdef")
. Sin embargo me sale el siguiente error:
Error in { : task 3 failed - "could not find function "Posdef""
¿Por qué no puedo encontrar esta función definida?
La respuesta corta es que se trató de un error en los backends paralelos, como doSNOW
, doParallel
y doMPI
, pero desde entonces se ha corregido.
La respuesta ligeramente más larga es que foreach
exporta funciones a los trabajadores que utilizan un entorno especial de "exportación", no el entorno global. Esto solía causar problemas para las funciones que se crearon en el entorno global, porque el entorno de "exportación" no estaba en su ámbito de aplicación, a pesar de que ahora estaban definidos en ese mismo entorno de "exportación". Por lo tanto, no pudieron ver ninguna otra función o variable definida en el entorno de "exportación", como "Posdef" en su caso.
Los doSNOW
, doParallel
y doMPI
ahora cambian el entorno asociado del entorno global al "exportar" para las funciones exportadas a través de ".export", y parece haber resuelto estos problemas.
La solución rápida para el problema con foreach% dopar% es reinstalar estos paquetes:
install.packages("doSNOW")
install.packages("doParallel")
install.packages("doMPI")
Funcionó en mi caso.