【问题标题】:random sampling from a large raster using clusterR使用clusterR从大栅格中随机抽样
【发布时间】: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


    【解决方案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 没有实际采样,以及为什么这个新代码效率更高,但很高兴解决了问题。

    【讨论】:

    • 您应该接受您的回答,然后问题就会显示为已解决。
    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多