2017-07-01 3 views
1

J'ai fait l'exemple mini-séquentielle suivante R:R: parallélisation avec doParallel et foreach

all_list <- list() 
all_list[1] <- list(1:6000) 
all_list[2] <- list(100000:450000) 
all_list[3] <- list(600000:1700000) 
all_list[4] <- list(2000000:3300000) 
all_list[5] <- list(3600000:5000000) 

find <- list(c(12800, 12800, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 1638400, 2457600, 3276800, 4096000, 4915200, 4915200)) 
result <- list() 
index <- 1 
current_Intervall <- 1 
current_number <- 1 

while(current_number <= 5000000){ 

    for(i in 1:length(find[[1]])){ 
    if(current_number == find[[1]][i]){ 
     result[[index]] <- current_number 
     index <- index + 1 
     break 
    } 
    } 

    current_number <- current_number + 1 
    last <- lengths(all_list[current_Intervall]) 
    if(current_number > all_list[[current_Intervall]][last]){ 
    if(current_Intervall == length(all_list)){ 
     break 
    }else{ 
     current_Intervall <- current_Intervall + 1 
     current_number <- all_list[[current_Intervall]][1] 
    } 
    } 
    print(current_number) 
} 

Je veux faire ce parallèle de code pour Windows. J'ai pensé au paquet doParallel et aux boucles foreach, parce que je n'ai pas trouvé de paquet supportant les boucles parallèles. Maintenant j'ai essayé ceci:

library(doParallel) 


all_list <- list() 
all_list[1] <- list(1:6000) 
all_list[2] <- list(100000:450000) 
all_list[3] <- list(600000:1700000) 
all_list[4] <- list(2000000:3300000) 
all_list[5] <- list(3600000:5000000) 

find <- list(c(12800, 12800, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 1638400, 2457600, 3276800, 4096000, 4915200, 4915200)) 
result <- list() 
index <- 1 
current_Intervall <- 1 
current_number <- 1 


no_cores <- detectCores() - 1 
cl <- makeCluster(no_cores) 
registerDoParallel(cl) 

print(current_number) 

foreach(current_number=1:5000000) %dopar% { 
    for(i in 1:length(find[[1]])){ 
    if(current_number == find[[1]][i]){ 
     result[[index]] <- current_number 
     index <- index + 1 
     break 
    } 
    } 

    # current_number <- current_number + 1 
    last <- lengths(all_list[current_Intervall]) 
    if(current_number > all_list[[current_Intervall]][last]){ 
    if(current_Intervall == length(all_list)){ 
     break 
    }else{ 
     current_Intervall <- current_Intervall + 1 
     current_number <- all_list[[current_Intervall]][1] 
    } 
    } 
    print(current_number) 
} 

stopCluster(cl) 

Mais la sortie d'impression n'imprime rien et après environ 2 minutes la boucle ne se termine pas. Mais l'exemple séquentiel se maintient après quelques secondes. Je pense qu'il y a quelque chose qui ne va pas.
Une autre question est: Est-il possible de redéfinir le numéro de compteur dans les boucles foreach? Dans la boucle while ci-dessus, je peux définir le compteur "current_number" arbitraire. Mais je pense que dans R, pour les boucles ne permet pas de redéfinir le numéro de compteur, non? Y a-t-il peut-être un meilleur paquet ou une autre boucle pour paralléliser le premier exemple?

Meilleures salutations, Brayn

Répondre

1

Si vous voulez quelque chose de sortie lors de l'utilisation du parallélisme, utilisez makeCluster(no_cores, outfile = "").

+0

Merci, je vais essayer ça. – Brayn

+0

@Brayn Si vous êtes satisfait de la réponse, veuillez la valider. –