2016-09-05 1 views
0

Es ist das erste Mal, dass ich die parallele Verarbeitung im Allgemeinen verwende. Die Frage betrifft hauptsächlich meine schlechte Syntax.cv.glmnet parallel und Speicherproblem

Ich hätte gerne Hilfe bei der Erfassung der Ausgabe für eine große Anzahl von cv.glmnet-Iterationen, da ich glaube, dass ich cv_loop_run als sehr ineffizient aufgebaut habe. Dies, zusammen mit der Anzahl von Lambdas, die 10k sind, führt zu einer massiven Matrix, die all mein Gedächtnis in Anspruch nimmt und einen Absturz verursacht. Im Wesentlichen was ich brauche, ist die Minimum und die 1se Lambda von jedem Lauf (1000 von ihnen, nicht alle 10.000). Anstatt eine 1kx10k Liste für cv_loop_run zu erstellen, würde ich eine 1k lange Liste bekommen.

registerDoParallel(cl=8,cores=4) 
    cv_loop_run<- rbind(foreach(r = 1:1000, 
           .packages="glmnet", 
           .combine=rbind, 
           .inorder =F) %dopar% { 

         cv_run <-cv.glmnet(X_predictors,Y_dependent,nfolds=fld, 
              nlambda = 10000, 
              alpha = 1, #FOR LASSO 
              grouped = FALSE, 
              parallel= TRUE 
             ) 

                } 
        ) 
    l_min<- as.matrix(unlist(as.matrix(cv_loop_run[,9 ,drop=FALSE]))) # matrix #9 is lamda.min 

    l_1se<- as.matrix(unlist(as.matrix(cv_loop_run[,10 ,drop=FALSE]))) # matrix #10 is lamda.1se 
+0

Wenn Sie den Code sucht 'cv.glmnet', wenn' parallel = true', gibt es bereits ein '' foreach'% Dopar% 'Schleife. Deshalb, (ich könnte mich irren, aber) Ich glaube nicht, dass Sie eine erhöhte Leistung erhalten werden, wenn Sie die Funktion cv.glmnet in eine andere 'foreach'% Dopar'-Schleife einschließen. Es ist so, als hätte man zwei verschachtelte parallele "foreach" -Schleifen, bei denen die innere Schleife bereits alle Kerne verwendet. – jav

+0

@jav Die innere Schleife, für die ich bereits die Parallele gesetzt habe = TRUE schleift durch die 1.000 Lambdas. Die äußere% dopar% -Schleife durchläuft 10.000 cv.glmnet-Läufe. –

Antwort

0

Ok, also habe ich es selbst gefunden. Ich muss nur die Ausgabe jedes cv.glmnet-Laufs beschränken. Auf diese Weise werden nur das Minimum und die 1se Lambda von jedem Lauf aufgenommen. Dies bedeutet, dass diese:

cv_run <-cv.glmnet(X_predictors,Y_dependent,nfolds=fld, 
             nlambda = 10000, 
             alpha = 1, #FOR LASSO 
             grouped = FALSE, 
             parallel= TRUE 
            ) 

wird dies:

cv_run <-cv.glmnet(X_predictors,Y_dependent,nfolds=fld, 
             nlambda = 10000, 
             alpha = 1, #FOR LASSO 
             grouped = FALSE, 
             parallel= TRUE 
            )[9:10]