【问题标题】:Application of mclapply() to a function writing to a global variable将 mclapply() 应用于写入全局变量的函数
【发布时间】:2014-11-28 13:47:49
【问题描述】:

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

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

【问题讨论】:

  • 你的问题的根源是在你的函数中使用&lt;&lt;-。不要那样做。让你的函数返回hist(l, ...)并在循环外组合直方图(可能使用Reduce,我不知道AddHistograms)。
  • 在你的文字中,你在下面提到了mclapply,但实际上,代码在文字的上面。这是一个错字还是我遗漏了什么?
  • @RomanLuštrik,我的错,我现在就解决这个问题。错字。
  • @Roland,感谢您的提示,我会尽快了解。我怀疑
  • 请自行回答。

标签: r parallel-processing lapply mclapply


【解决方案1】:

问题是&lt;&lt;-,据我所知,这通常是不好的做法。

函数可以这样重新排列:

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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-28
    • 2017-06-16
    • 1970-01-01
    • 2022-01-20
    • 2022-10-14
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多