używając parLapply równoległego: nie można uzyskać dostępu do zmiennych w kodzie równoległym
Niedawno dostałem komputer z kilkoma rdzeniami i uczę się korzystać z obliczeń równoległych. Jestem dość sprawnylapply
i powiedziano miparLapply
działa bardzo podobnie. Nie działam jednak prawidłowo. Wydaje się, że muszę wyraźnie umieścić wszystko w środkuparLapply
aby to działało (czyli funkcje, które mają być używane, zmienne itp.). Zlapply
czyta ze środowiska macierzystego iparLapply
nie robi tego. W poniższym przykładzie mogłem sprawić, by wszystko działało, umieszczając wszystkie informacje wewnątrzparLapply
ale jeśli użyję tego w funkcji zdefiniowanej przez użytkownika, nie mogę go jawnie umieścićtext.var
wnętrzeparLapply
.
library(parallel)
text.var <- rep("I like cake and ice cream so much!", 20)
ntv <- length(text.var)
gc.rate <- 10
pos <- function(i) {
paste(sapply(strsplit(tolower(i), " "), nchar), collapse=" | ")
}
lapply(seq_len(ntv), function(i) {
x <- pos(text.var[i])
if (i%%gc.rate==0) gc()
return(x)
}
)
#doesn't work
cl <- makeCluster(mc <- getOption("cl.cores", 4))
parLapply(cl, seq_len(ntv), function(i) {
x <- pos(text.var[i])
if (i%%gc.rate==0) gc()
return(x)
}
)
#does work but have to specify all the stuff inside parLapply
cl <- makeCluster(mc <- getOption("cl.cores", 4))
parLapply(cl, seq_len(ntv), function(i) {
######stuff I have to put inside parLapply##########
text.var <- rep("I like cake and ice cream so much!", 20)
ntv <- length(text.var)
gc.rate <- 10
pos <- function(i) {
paste(sapply(strsplit(tolower(i), " "), nchar), collapse=" | ")
}
######stuff I have to put inside parLapply##########
x <- pos(text.var[i])
if (i%%gc.rate==0) gc()
return(x)
}
)
Jak mogę przejśćtext.var
, ntv
, gc.rate
, ipos
doparLapply
bez wyraźnego umieszczenia ich w środku? (Zgaduję, że w jakiś sposób podajesz je jako listę)
PS Windows 7 maszyna, więc muszę użyćparLapply
Myślę