使用clusterR

时间:2018-11-01 19:29:31

标签: r parallel-processing raster

我需要从一个很大的栅格中抽取5%的随机样本,然后返回一个新栅格。我正在尝试使用sampleRandom软件包中的raster,但是过程非常慢(我的机器上只有8GB RAM,运行64位R)。栅格已被裁剪/遮罩以匹配不规则形状的研究区域边界-多边形边界周围的矩形范围内的NA值和一些内部NA值也是如此-我正尝试仅从非NA值采样。我已经尝试了5%的采样率并将其转换为95%的采样率-都运行了2个小时以上却没有产生结果,这时我终止了该过程。

我试图通过使用clusterR命令并行运行来加快速度,但是我对sampleRandom命令和clusterR都是陌生的。我的代码运行了,但是我得到了所有非NA像素的返回,因此该示例似乎无法正常工作。这是我的代码有问题还是sampleRandom无法与clusterR一起运行?

这是我的栅格图层的描述:

conv.mod
class       : RasterLayer 
dimensions  : 23828, 19095, 454995660  (nrow, ncol, ncell)
resolution  : 56, 56  (x, y)
extent      : -1220192, -150872, 87580, 1421948  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=aea +lat_1=44.75 +lat_2=55.75 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
data source : C:\GIS\carbon_cows\Intact\conv_mod.tif 
names       : conv_mod 
values      : 1, 1  (min, max)

这是我尝试过的代码:

library(raster)
library(parallel)

tot<-cellStats(conv.mod,'sum', na.rm=TRUE) #get the total pixels in conv.mod
sampsize<-tot * 0.05 #calculate how many pixels would represent 5% 
removeTmpFiles() #clear some memory

numcores<-detectCores() -1

start<-Sys.time()

beginCluster(numcores)
cl<-getCluster()
clusterExport(cl,"sampsize", envir = .GlobalEnv)
conv.perc <- clusterR(conv.mod,sampleRandom,args=list(size=sampsize,na.rm=TRUE,asRaster=TRUE))
endCluster()

end<-Sys.time()
difftime(end,start)

以下是原始栅格图层中的所有非NA像元:

tot<-cellStats(conv.mod,'sum', na.rm=TRUE)
tot
105193858

以及应为5%样本的数字:

sampsize<-tot * 0.05
sampsize
5259693

但是,生成的栅格具有与原始栅格相同数量的非NA像素:

tot_convperc<-cellStats(conv.perc,'sum',na.rm=T)
tot_convperc
105193858

我还尝试了逆转样本量计算并运行sampleRandom,因此我希望获得95%的样本。但是,我得到相同的结果。

我很高兴能帮助您理解为什么此代码未按预期运行。谢谢!

1 个答案:

答案 0 :(得分:1)

没关系。我能够利用以下信息:https://gis.stackexchange.com/questions/17255/random-sampling-of-raster-using-r和whuber的回复。

以下代码无需使用集群即可解决我的问题:

col.conv <- ncol(conv.mod)
row.conv<-nrow(conv.mod)
r<-conv.mod
start<-Sys.time()
r[runif(col.conv*row.conv) >= 0.95] <- NA # Randomly *unselect* 5% of the data

end<-Sys.time()
difftime(end,start)

该代码运行了大约3分钟,而将simpleRandom代码放入clusterR命令则需要一个多小时。我仍然想知道为什么simpleRandom并没有实际取样,为什么这个新代码效率更高,却乐于解决问题。