2016-12-26 21 views
1

Ich möchte Eingabe, wie mein Code unten strukturiert ist. Möchte wissen, ob es auf eine andere Weise organisiert werden muss, um schneller auszuführen. Genauer gesagt, ob ich foreach und dopar anders in den verschachtelten Schleifen verwenden muss. Derzeit ist die innere Schleife der Hauptteil der Arbeit (ddply mit 1-8 Zusammenbruchvariablen, von denen jede 10-200 Niveaus hat), und das ist, was ich parallel laufen lasse. Ich habe die Code-Details aus Gründen der Einfachheit weggelassen.Optimieren verschachtelte foreach Dopar in R

Irgendwelche Ideen? Mein Code, wie unten beschrieben, funktioniert, aber es dauert ein paar Stunden auf einem 6-Core, 41GB-Rechner. Der Datensatz ist nicht so groß (< 20k Datensätze).

for(m in 1:length(Predictors)){ # has up to three elements in the vector 

    # construct the dataframe based on the specified predictor 
    # subset the original dataframe based on the breakdown variables, outcome, predictor and covariates 

    for(l in 1:nrow(pairwisematrixReduced)){ # this has 1-6 rows;subset based on correct comparison groups 

    # some code here 

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

    for (i in 1:nrow(subsetting_table)){ # this table has about 50 rows 

     # this uses the columns specified by k in the glm; the prior columns will be used as breakdown variables 
     # up to 10 covariates 
     result[[length(result) + 1]] <- foreach(k = 11:17, .packages=c('plyr','reshape2', 'fastmatch')) %dopar% { 

     ddply( 
      df, 
      b, # vector of breakdown variables 
      function(x) { 

      # run a GLM and manipulate the output 

      ,.parallel = TRUE) # close ddply 
     } # close k loop -- set of covariates 
    } # close i loop -- subsetting table 
    } #close l -- group combinations 
} # close m loop - this is the pairwise predictor matrix 

stopCluster(cl) 
result <- unlist(result, recursive = FALSE) 
tmp2<-do.call(rbind.fill, result) 
+0

Ich empfehle, die folgenden Befehle auszuführen und lesen Sie über den Unterschied zwischen '% Dopar%' und '%:%'. 'vignette (" foreach ")' und 'vignette (" nested ")' – manotheshark

+0

die foreach ist innerhalb i – Josh

+1

Ich vermisste das 'foreach', aber ich würde empfehlen, die Vignette zu lesen, die ich oben erwähnte. Es wird einfacher sein, sowohl 'foreach' als auch' ddply' als 'foreach'-Anweisungen zu schreiben, wobei einer'% dopar' und der andere '%: %' verwendet. Die Vignette spricht über die Vorteile der Parallelen der inneren vs äußeren Schleife. Sie müssen Ihren eigenen Code testen, da er datenabhängig ist, aber es wird so einfach wie das Tauschen von '% dopar%' und '%:%' zwischen den beiden 'foreach'. – manotheshark

Antwort

4

aus vignette("nested")

Kopiert

3 Verwenden%:%% mit dopar%

Wenn für verschachtelte Schleifen zu parallelisieren, gibt es immer eine Frage, welche Schleife parallelisieren. Die Standard-Beratung ist ...

Sie sind auch foreach%dopar% zusammen mit ddply und .parallel=TRUE verwenden. Mit einem Sechs-Kern-Prozessor (und vermutlich Hyper-Threading) bedeutet, dass der foreach Block 12 Umgebungen starten würde und dann die ddply 12 Umgebungen in jedem dieser für 144 gleichzeitige Umgebungen starten würde. Die foreach sollte in %do% geändert werden, um mit Ihren Fragen Text der parallelen Ausführung der inneren Schleife konsistent sein. Oder um es sauberer zu machen, ändern Sie beide auf foreach und verwenden Sie %dopar% für eine Schleife und %:% für die andere.

Verwandte Themen