C'est la première fois que j'utilise le traitement parallèle en général. La question concerne principalement ma mauvaise syntaxe. Je voudrais un peu d'aide pour capturer la sortie pour un grand nombre d'itérations de cv.glmnet, car je crois que j'ai construit cv_loop_run pour être très inefficace. Ceci, avec le nombre de lambdas étant 10k conduit à une matrice massive qui prend toute ma mémoire et provoque un accident. En substance, ce dont j'ai besoin est le minimum et le 1se lambda par chaque série (1000 d'entre eux, pas tous les 10.000). Donc, au lieu d'avoir une liste de 1kx10k capturée pour cv_loop_run, j'aurais une liste longue de 1k.cv.glmnet parallèle et problème de mémoire
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
Si vous regardez le code de 'cv.glmnet', quand' parallèle = TRUE', il existe déjà un '' foreach'% dopar% 'boucle. Par conséquent, (je peux me tromper mais) je ne crois pas que vous obtiendrez des performances accrues de l'encapsulation de la fonction cv.glmnet dans une autre boucle 'foreach''% dopar'. C'est comme avoir deux boucles 'foreach' parallèles imbriquées, où votre boucle interne utilise déjà tous les cœurs. – jav
@jav La boucle interne, pour laquelle j'ai déjà défini les boucles parallel = TRUE à travers les 1000 lambdas. La boucle externe% dopar% parcourt 10 000 cycles cv.glmnet. –