3 votes

Comment puis-je étiqueter mes sous-processus pour la journalisation lorsque j'utilise multicore et doMC dans R

J'ai commencé à utiliser le doMC pour R en tant qu'arrière-plan parallèle pour les applications parallélisées. plyr routines.

La parallélisation elle-même semble fonctionner correctement (bien que je n'aie pas encore évalué la vitesse), mon problème est que la journalisation est maintenant asynchrone et que les messages des différents cœurs sont mélangés. Je pourrais créer des fichiers de journalisation différents pour chaque cœur, mais je pense que la solution la plus nette serait d'ajouter simplement une étiquette différente pour chaque cœur. J'utilise actuellement le fichier log4r pour mes besoins en matière de journalisation.

Je me souviens que, lorsque j'utilisais MPI, chaque processeur avait un rang, ce qui était un moyen de distinguer les processus les uns des autres. doMC ? J'ai eu l'idée d'extraire le PID, mais cela semble désordonné et changera à chaque itération.

Mais je suis ouvert aux idées, donc toute suggestion est la bienvenue.

MODIFIER (2011-04-08) : En suivant la suggestion d'une réponse, je dois encore identifier correctement le sous-processus dans lequel je me trouve actuellement, car j'aurais besoin de fermetures distinctes pour chaque processus. log() pour qu'il écrive dans le bon fichier, ou bien j'aurais un simple log() mais avec une logique interne déterminant le fichier journal à ajouter. Dans les deux cas, j'aurais toujours besoin d'un moyen d'étiqueter le sous-processus actuel, mais je ne suis pas sûr de la façon de le faire.

Existe-t-il un équivalent de la mpi_rank() de la bibliothèque MPI ?

4voto

Steve Lianoglou Points 3792

Je pense qu'avoir plusieurs processus qui écrivent dans le même fichier est une recette pour un désastre (c'est juste un journal, donc peut-être que "désastre" est un peu fort).

Souvent, je parallélise le travail sur les chromosomes. Voici un exemple de ce que je ferais (j'ai surtout utilisé foreach/doMC) :

foreach(chr=chromosomes, ...) %dopar% {
  cat("+++", chr, "+++\n")
  ## ... some undoubtedly amazing code would then follow ...
}

Et il ne serait pas inhabituel d'avoir une production qui se piétine les uns les autres ... quelque chose. comme (pas exactement) ceci :

+++chr1+++
+++chr2+++
++++chr3++chr4+++

... vous voyez l'idée ...

Si j'étais à votre place, je pense que je diviserais les journaux pour chaque processus et que je définirais leurs noms de fichiers respectifs pour qu'ils soient uniques par rapport à ce qui se passe dans la boucle de ce processus (comme par exemple chr dans mon cas ci-dessus). Rassemblez-les plus tard si vous le devez... c'est-à-dire, mappez/réduisez vos fichiers journaux :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X