Comment puis-je étiqueter mes sous-processus pour la journalisation lors de l'utilisation de Multicore et DOMC dans R

StackOverflow https://stackoverflow.com/questions/5472599

  •  14-11-2019
  •  | 
  •  

Question

J'ai commencé à utiliser le doMC package pour r comme backend parallèle pour parallélisé plyr Routines.

La parallélisation elle-même semble fonctionner correctement (bien que je n'ai pas encore correctement comparé la vitesse), mon problème est que la journalisation est maintenant asynchrone et que les messages de différents noyaux se mélangent ensemble. Je pouvais créer différents fichiers de journaux pour chaque noyau, mais je pense que la solution plus nette est d'ajouter simplement une étiquette différente pour chaque noyau. J'utilise actuellement le log4r Package pour mes besoins de journalisation.

Je me souviens lors de l'utilisation de MPI que chaque processeur a obtenu un rang, qui était un moyen de distinguer chaque processus les uns des autres, il y a donc un moyen de le faire avec doMC? J'avais l'idée d'extraire le PID, mais cela semble désordonné et changera pour chaque itération.

Je suis ouvert aux idées, donc toutes les suggestions sont les bienvenues.

Edit (2011-04-08): En allant avec la suggestion d'une réponse, j'ai toujours le problème d'identifier correctement quel sous-processus je suis actuellement à l'intérieur, car j'aurais besoin de fermetures distinctes pour chaque log() Appelez pour qu'il écrit dans le bon fichier, ou j'aurais un seul log() Fonction, mais avoir une logique à l'intérieur pour déterminer quel fichier de journal pour ajouter. Dans les deux cas, j'aurais encore besoin d'un moyen d'étiqueter le sous-processus actuel, mais je ne sais pas comment procéder.

Y a-t-il un équivalent du mpi_rank() Fonction dans la bibliothèque MPI?

Était-ce utile?

La solution

Je pense qu'avoir un processus multiple écrit dans le même fichier est une recette pour une catastrophe (c'est juste un journal, donc peut-être que "la catastrophe" est un peu forte).

Souvent, je parallélise le travail sur les chromosomes. Voici un exemple de ce que je ferais (j'utilise principalement ForEach / DOMC):

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

Et il ne serait pas inhabituel d'obtenir une sortie qui se précipite les uns sur les autres ... quelque chose Comme (pas exactement) ceci:

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

... vous avez eu l'idée ...

Si j'étais à vos chaussures, je pense que je diviserais les journaux de chaque processus et que je définirais leurs noms de fichiers respectifs pour être uniques en ce qui concerne quelque chose qui se passe dans la boucle de ce processus (comme chr dans mon cas ci-dessus). Rassemblez-les plus tard si vous devez ... c'est-à-dire. Carte / Réduisez vos fichiers journaux :-)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top