将mclapply()应用于写入全局变量的函数

时间:2014-11-28 13:47:49

标签: r parallel-processing lapply mclapply

我尝试使用parallel::mclapply来加快以下代码的计算:

library(raster)  
library(HistogramTools)#for AddHistogram
#Create a first h here for the first band... omitted for brevity
readNhist <- function(n,mconst) {
  l <- raster(filename[i], varname=var[i], band=n, na.rm=T)
  gain(l) <- mconst
  h <<- AddHistograms(h, hist(l, plot=F, breaks=histbreaks,right=FALSE))
}
lapply(   1:10000, readNhist, mconst=1, mc.cores=7  )
#Then do stuff with the h histogram...

执行上述代码时,一切都很好。如果使用mclapply(下面),结果距离我想要获得的距离数英里:直方图都是错误的。

library(raster)  
library(HistogramTools)#for AddHistogram
library(parallel)
#Create a first h here for the first band... omitted for brevity
readNhist <- function(n,mconst) {
  l <- raster(filename[i], varname=var[i], band=n, na.rm=T)
  gain(l) <- mconst
  h <<- AddHistograms(h, hist(l, plot=F, breaks=histbreaks,right=FALSE))
}
mclapply(   2:10000, readNhist, mconst=1  )
#Then do stuff with the h histogram...

我觉得在这个函数中应用并行计算时我缺少了一些重要的东西。

1 个答案:

答案 0 :(得分:1)

问题是<<-,就我而言,这是一个不好的做法。

这个功能可以重新排列:

readNhist <- function(n,mconst) {
  l <- raster(filename, varname=var, band=n, na.rm=T)
  gain(l) <- mconst
  hist <- hist(l, plot=F, breaks=histbreaks,right=FALSE)
  return(hist)
}

并且这样称呼:

hists <- mclapply(   2:nbands, readNhist, mconst=gain, mc.cores=ncores  )
ch <- AddHistograms(x=hists)
h <- AddHistograms(h, ch)
rm(ch, hists)

即使有大量的图层(以及直方图),这也非常快。