Hola,

Estoy desarrollando un algoritmo para bases de datos grandes. Básicamente es un 
algoritmo con varias iteraciones en el que comparo el valor de la iteración 
actual y lo comparo con el de la anterior. Si es menor, lo reemplazo. Si no, no.

He escrito la versión simple con un bucle for y la versión en paralelo usando 
un bucle foreach paralelizando en varios núcleos para tratar de reducir el 
tiempo de computación. Lo que pasa es que no obtengo los mismos resultados con 
ambos algoritmos. Y es que no consigo entender bien cómo actua foreach usando 
varios núcleos, por lo que quisiera pediros vuestra ayuda.

Un ejemplo sencillo es el siguiente:

En primer lugar, la versión for:
set.seed(10)
vect <- c()
err <- Inf
for (i in 1:3) {
  vect <- c(vect, sample(-10:10, 1))
  if (vect[i] < err) {
    err <- vect[i]
  }
}
vect
#[1] 0 -4 -2
err
#[1] -4
Efectivamente, el error obtenido es el menor valor.

Ahora la versión foreach sin paralelizar (por ello aparece un warning, según se 
indica en la viñeta de doParallel):
library(foreach)
comb <- function(a, b) { 
  if (a < b) {
    return(a)
  }else{
    return(b)   
  } 
}
set.seed(10)
vect <- c()
err <- Inf
d1 <- foreach(i = 1:3, .combine = "rbind") %dopar% {
  vect <- c(vect, sample(-10:10, 1))
  err <- comb(vect[i], err)
  data.frame(cand = vect[i], err = err)
}
d1 
#  cand err
#1    0   0
#2   -4  -4
#3   -2  -4
De nuevo nos aparece que el error es -4.

Por último, la versión foreach con doParallel, en la que no consigo obtener los 
mismos resultados:
library(doParallel)
library(doRNG)
no_cores <- detectCores() - 1
no_cores 
#[1] 3
cl <- makeCluster(no_cores)
registerDoParallel(cl)
registerDoRNG(10)
vect <- c()
d1 <- foreach(i = 1:3, .combine = "rbind") %dopar% {
  err <- Inf
  comb <- function(a, b) { 
    if (a < b) {
      return(a)
    }else{
      return(b)   
    } 
  }
  vect <- sample(-10:10, 1)
  err <- comb(vect, err)
  data.frame(cand = vect, err = err)
}
d1
#  cand err
#1   10  10
#2    4   4
#3    6   6
stopCluster(cl)

Parece que cada iteración se ha ido a un núcleo diferente y no se comparan 
entre sí, sino cada una con el valor inicial Inf. ¿Sabéis cómo conseguir la 
comparación entre sucesivos valores en el caso del foreach paralelo?

Muchas gracias de antemano.

Saludos,

Guillermo

_______________________________________________
R-help-es mailing list
[email protected]
https://stat.ethz.ch/mailman/listinfo/r-help-es

Responder a