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)
Ich empfehle, die folgenden Befehle auszuführen und lesen Sie über den Unterschied zwischen '% Dopar%' und '%:%'. 'vignette (" foreach ")' und 'vignette (" nested ")' – manotheshark
die foreach ist innerhalb i – Josh
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