À l'aide de parLapply et clusterExport l'intérieur d'une fonction
J'ai posé une question liée à l'ici et la réponse a bien fonctionné: en utilisant en parallèle du parLapply: impossible d'accéder à des variables au sein du code en parallèle
Le problème est que lorsque j'essaie d'utiliser la réponse à l'intérieur de la fonction, ça ne marchera pas car je pense qu'il a à l'environnement par défaut de clusterExport
. J'ai lu la vignette et regarda le fichier d'aide, mais je suis approcher de ce avec un nombre très limité de la base de connaissances. La façon dont j'ai utilisé parLapply
j'ai attendu qu'elle se comportent de manière semblable à lapply
mais il ne semble pas.
Voici ma tentative:
par.test <- function(text.var, gc.rate=10){
ntv <- length(text.var)
require(parallel)
pos <- function(i) {
paste(sapply(strsplit(tolower(i), " "), nchar), collapse=" | ")
}
cl <- makeCluster(mc <- getOption("cl.cores", 4))
clusterExport(cl=cl, varlist=c("text.var", "ntv", "gc.rate", "pos"))
parLapply(cl, seq_len(ntv), function(i) {
x <- pos(text.var[i])
if (i%%gc.rate==0) gc()
return(x)
}
)
}
par.test(rep("I like cake and ice cream so much!", 20))
#gives this error message
> par.test(rep("I like cake and ice cream so much!", 20))
Error in get(name, envir = envir) : object 'text.var' not found
- On dirait que vous devez utiliser le
envir
argumentclusterExport
commevarlist
est exporté à partir du.GlobalEnv
par défaut. Neenvir=environment()
travail? - GSee j'ai monkied autour de la lecture et de recherche pour les 3 heures. Je ne suis pas vraiment bon avec l'environnement des trucs, mais qui fonctionne parfaitement. Pouvez-vous ajouter comme une réponse et je vais le marquer comme correcte.
- J'ai fait un post de blog sur mon apprentissage avec cette pour de futurs chercheurs: trinkerrstuff.wordpress.com/2012/08/19/...
Vous devez vous connecter pour publier un commentaire.
Par défaut
clusterExport
regarde dans le.GlobalEnv
pour les objets à l'exportation qui sont nommés dansvarlist
. Si vos objets ne sont pas dans le.GlobalEnv
, vous devez direclusterExport
de l'environnement dans lequel il peut trouver ces objets.Vous pouvez modifier votre
clusterExport
pour la suite (que je n'ai pas fait de test, mais vous avez dit œuvres dans les commentaires)De cette façon, il se regarde dans la fonction de l'environnement pour les objets à exporter.
Une autre solution consiste à inclure les variables supplémentaires comme arguments à votre fonction; parLapply exportations de trop. Si le texte.var' est le big data, puis il paie pour faire de l'argument qui lui est appliquée, plutôt qu'un indice, parce que seule la portion de texte.var pertinents pour chaque travailleur est exporté, plutôt que l'ensemble de l'objet à chaque travailleur.
C'est aussi sur le plan conceptuel agréable. (Il est rarement nécessaire d'invoquer explicitement le garbage collector).
De gestion de la mémoire lors de l'
source()
ing un script pose des problèmes supplémentaires. Compareravec le même appel à un script
Rappelez-vous que la R est
serialize()
fonction, utilisée en interne parparLapply()
de déplacer les données sur les travailleurs, sérialise le tout à la .GlobalEnv. De sorte que les données des objets créés dans le script sont sérialisés pour le travailleur, alors que si elle est exécutée de manière interactive, ils ne seraient pas être sérialisé. Ceci peut expliquer @SeldeomSeenSlim de problèmes lors de l'exécution d'un script. Probablement la solution est de plus clairement distincte des "données" de "algorithme", par exemple, en utilisant le système de fichiers ou une base de données ou ... pour stocker des objets.lapply
's d'utilisation. +1 Ce qui a probablement la réponse que je vais utiliser.lapply
sur de nombreuses cellules. J'ai écrit les auteurs sur ce sujet il y a un an. J'ai été informé d'un correctif pour ce mais ne pouvais pas le faire fonctionner à l'époque. Thread sur: talkstats.com/showthread.php/...clusterApply
appel, même après l'appel destopCluster
et la sortie de la fonction parent, pas de collecte des ordures avait eu lieu. Merci pour cet exemple de code.parLapply
il n'y a pasi
.Davit Sargasyan
question ici. J'ai un complexe de source script qui lance un cluster, et exécuteparLapply
à quelques reprises tout au long du script. Le script s'exécute comme prévu lors de l'exécution dans un non-sourcés; si je source, une sorte de fuite de mémoire formes et le script échoue. Quand je le lance non d'origine, il utilise peut-être 2 ou 3 go de mémoire totale; quand je le lance de source, il comble toutes les 32 go de RAM. Je suis au moins 98% convaincu de son un environnement de problème mais je ne peux pas le retrouver.