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 に答える