0

我正在尝试使用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...

我觉得将并行计算应用于此功能时,我缺少一些重要的东西。

4

1 回答 1

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)

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

于 2014-12-01T11:51:36.880 回答