“annuler l'inscription” un doParallel cluster
Si je lance foreach... %dopar%
sans enregistrer un cluster, foreach soulève un avertissement, et exécute le code de manière séquentielle:
library("doParallel")
foreach(i=1:3) %dopar%
sqrt(i)
Rendements:
Warning message:
executing %dopar% sequentially: no parallel backend registered
Cependant, si je lance ce même code, après le démarrage, l'enregistrement et l'arrêt d'un cluster, il échoue:
cl <- makeCluster(2)
registerDoParallel(cl)
stopCluster(cl)
rm(cl)
foreach(i=1:3) %dopar%
sqrt(i)
Rendements:
Error in summary.connection(connection) : invalid connection
Est-il opposé de registerDoParallel()
qui nettoie le cluster de l'enregistrement? Ou suis-je coincé avec le fantôme de l'ancien cluster jusqu'à ce que je re-démarrer ma session R?
/edit: une recherche sur google révèle les bumphunter:::foreachCleanup()
fonction dans le bumphunter Biocondoctor package:
function ()
{
if (exists(".revoDoParCluster", where = doParallel:::.options)) {
if (!is.null(doParallel:::.options$.revoDoParCluster))
stopCluster(doParallel:::.options$.revoDoParCluster)
remove(".revoDoParCluster", envir = doParallel:::.options)
}
}
<environment: namespace:bumphunter>
Cependant, cette fonction ne semble pas résoudre le problème.
library(bumphunter)
cl <- makeCluster(2)
registerDoParallel(cl)
stopCluster(cl)
rm(cl)
bumphunter:::foreachCleanup()
foreach(i=1:3) %dopar%
sqrt(i)
Où foreach de conserver les informations sur le cluster?
- Ne devriez-vous pas être à l'aide de stopCluster(cl) après le foreach() de l'op? La fourche doit être fermée et il n'y a pas besoin d'enlever la cl de l'objet.
- McCarthy Habituellement qu'est ce que vous feriez, oui. Le point est, après la fourche est fermé,
foreach
est toujours recherché par l'arrêté du cluster. - Peut-être que je ne suis pas vous suit à droite. Le comportement attendu est de courir
foreach
après le cluster est arrêté, ou contre votre gré, le cluster s'arrête prématurément, avantforeach
finitions, ou quelque chose d'autre? En relisant, vous voulez qu'il fonctionne, mais avec un avertissement dans le cas où le cluster est arrêté? - McCarthy j'aimerais revenir à foreach en cours d'exécution avec un avertissement plutôt qu'une erreur après que le cluster est de-enregistrés.
Vous devez vous connecter pour publier un commentaire.
La seule façon de "se désinscrire" un foreach backend est d'enregistrer la séquence du backend:
Cela fait sens pour moi parce que vous êtes censé déclarer backend à utiliser, donc je ne vois pas l'intérêt de fournir un moyen de "undeclare" qui backend à utiliser. Au lieu de cela, vous déclarez que vous voulez utiliser la séquence principale, qui est la valeur par défaut.
J'ai d'abord envisagé d'inclure un "désinscrire" de la fonction, mais depuis je n'arrivais pas à me convaincre qu'il était utile, j'ai décidé de les laisser, car il est beaucoup plus facile d'ajouter une fonction que d'en enlever une.
Cela étant dit, je pense que tout ce que vous devez faire est de supprimer toutes les variables de
foreach:::.foreachGlobals
qui est l'endroit où foreach garde l'ensemble de son état:Après l'appel de cette fonction, tout en parallèle backend sera radié et l'avertissement sera émis à nouveau si
%dopar%
est appelé.registerDoSeq
->unregister
serait la voie à suivre?Cela a bien fonctionné pour moi.
stopCluster(cl)
et puis essayez d'exécuter%dopar%
, il échouera. Vous devez exécuterregisterDoSEQ()
premier.on.exit()
signifiestopCluster
n'est jamais appelé au cours de votre session. J'ai besoin d'un moyen d'arrêter le cluster et puis continuer à courir%dopar%
code