for r foreach parallel-processing

for in r



Construyendo una funciĆ³n para.combine en foreach (1)

Para ejecutar tareas en la función de combinación, debe incluir información adicional en el objeto de resultado devuelto por el cuerpo del bucle foreach. En este caso, eso sería un indicador de error y el valor de i . Hay muchas formas de hacerlo, pero aquí hay un ejemplo:

comb <- function(results, x) { i <- x$i result <- x$result if (x$error) { cat(sprintf(''master computing failed task %d/n'', i)) # Could call function repeatedly until it succeeds, # but that could hang the master result <- try(fails_randomly(i)) } results[i] <- list(result) # guard against a NULL result results } r <- foreach(i=1:100, .combine=''comb'', .init=vector(''list'', 100)) %dopar% { tryCatch({ list(error=FALSE, i=i, result=fails_randomly(i)) }, error=function(e) { list(error=TRUE, i=i, result=e) }) }

Me sentiría tentado a lidiar con este problema ejecutando el bucle paralelo repetidamente hasta que todas las tareas hayan sido calculadas:

x <- rnorm(100) results <- lapply(x, function(i) simpleError('''')) # Might want to put a limit on the number of retries repeat { ix <- which(sapply(results, function(x) inherits(x, ''error''))) if (length(ix) == 0) break cat(sprintf(''computing tasks %s/n'', paste(ix, collapse='',''))) r <- foreach(i=x[ix], .errorhandling=''pass'') %dopar% { fails_randomly(i) } results[ix] <- r }

Tenga en cuenta que esta solución utiliza la opción .errorhandling , que es muy útil si se pueden producir errores. Para obtener más información sobre esta opción, consulte la página man de foreach.

Tengo un proceso que quiero hacer en paralelo pero fallo debido a algún error extraño . Ahora estoy considerando combinar y calcular la tarea fallida en la CPU maestra. Sin embargo, no sé cómo escribir esa función para .combine.

¿Cómo debería escribirse?

Sé cómo escribirlos, por ejemplo, esta respuesta proporciona un ejemplo, pero no proporciona cómo manejar tareas fallidas, ni repite una tarea en el maestro.

Haría algo como:

foreach(i=1:100, .combine = function(x, y){tryCatch(?)} %dopar% { long_process_which_fails_randomly(i) }

Sin embargo, ¿cómo uso la entrada de esa tarea en la función .combine (si se puede hacer)? ¿O debería proporcionar dentro del %dopar% para devolver un indicador o una lista para calcularlo?