【发布时间】:2019-04-06 01:58:01
【问题描述】:
我需要从一个非常大的栅格中抽取 5% 的随机样本并返回一个新栅格。我正在尝试使用 raster 包中的 sampleRandom,但过程非常缓慢(我的机器上只有 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% 的样本。但是,我得到了相同的结果。
如果能帮助我理解为什么这段代码没有按预期运行,我将不胜感激。谢谢!
【问题讨论】:
标签: r parallel-processing raster