我最近有一台具有多个内核的计算机,并且正在学习使用并行计算。我对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.varntvgc.ratepos传递给parLapply而不显式地将它们放入内部? (我猜您以某种方式将它们作为列表传递了)

PS Windows 7机器,所以我需要使用parLapply

最佳答案

您需要将这些变量导出到集群中的其他R进程:

cl <- makeCluster(mc <- getOption("cl.cores", 4))
clusterExport(cl=cl, varlist=c("text.var", "ntv", "gc.rate", "pos"))

08-25 03:36