我最近有一台具有多个内核的计算机,并且正在学习使用并行计算。我对lapply
相当精通,并被告知parLapply
的工作原理非常相似。我没有正确操作它。看来我必须明确地将所有内容放入parLapply
中才能使其正常工作(即要使用的函数,变量等)。使用lapply
时,它从父环境中读取,而parLapply
似乎不这样做。因此,在下面的示例中,我可以通过将所有信息放入parLapply
来使所有信息正常工作,但是如果在用户定义的函数中使用此信息,则无法明确将text.var
放入parLapply
。
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)
}
)
我如何将
text.var
,ntv
,gc.rate
和pos
传递给parLapply
而不显式地将它们放入内部? (我猜您以某种方式将它们作为列表传递了)PS Windows 7机器,所以我需要使用
parLapply
最佳答案
您需要将这些变量导出到集群中的其他R进程:
cl <- makeCluster(mc <- getOption("cl.cores", 4))
clusterExport(cl=cl, varlist=c("text.var", "ntv", "gc.rate", "pos"))