R语言 使用“global()”和“quantile()”计算大型栅格Map的分位数值

rhfm7lfc  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(145)

在尝试计算大型光栅文件(.tif文件)的0.05和0.95分位数值时,我遇到了一些问题。
我在一台高性能计算机上运行了我的脚本(见下面的计算能力),但我的R会话仍然被中止。我在一个较小的光栅文件上测试,一切都很顺利,我可以得到分位数值,但当替换为较大的光栅时,R会话再次中止。
有件事我不明白。当我在运行R脚本时检查内存使用情况时,内存使用率总是达到50%左右,无论我使用哪台计算机,内存空间较小的计算机也达到50%左右。当内存使用率达到50%左右时,R会话被中止。
我猜这可能与内存有关,因为当我在一个小光栅瓷砖上运行时,脚本工作得很好。
我使用terra package和global()和quantile()来获取栅格的分位数值。

library(terra)

#Load the data
tile <- rast('D:/Data/Tiles/_56.tif')

#Create a dataframe to store outputs.
q <- data.frame(Q.5 = as.numeric(NA), Q.95 = as.numeric(NA))
q$Q.5 <- global(tile, \(i) quantile(i, 0.05, na.rm=T)) 
q$Q.95 <- global(tile, \(i) quantile(i, 0.95, na.rm=T))

我也尝试了光栅包:

library(raster)

#Load the data
r <- raster('I:/WarmingMagnitude_SSP370_v3.tif')

#Create a dataframe to store outputs.
q <- data.frame(quantile0.05 = as.double(NA), quantile0.95 = as.double(NA))
q$quantile0.95 <- as.numeric(quantile(r, 0.95, na.rm = TRUE))
q$quantile0.05 <- as.numeric(quantile(r, 0.05, na.rm = TRUE))

Here你可以找到小光栅作为一个例子。作为示例,可以下载大栅格文件(2.45 GB)here
Here is information about my computer
Here is the error I encountered
先谢谢你了!
我试图在R中获取我的大.tif文件的分位数值。我需要0.05和0.95分位数值。

> r
class       : SpatRaster 
dimensions  : 161239, 132862, 1  (nrow, ncol, nlyr)
resolution  : 25, 25  (x, y)
extent      : 2634975, 5956525, 1385025, 5416000  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs 
source      : WarmingMagnitude_SSP370_v3.tif 
name        : future microclimate SSP370 
min value   :                       -3.2 
max value   :                        8.9
bcs8qyzn

bcs8qyzn1#

要获取栅格图层所有像元的分位数,可以执行以下操作

library(terra)
r <- rast(system.file("ex/elev.tif", package="terra"))
global(r, quantile, probs=c(0.05, 0.95), na.rm=TRUE)
#          X5. X95.
#elevation 232  489

您遇到的问题是,要使用stats::quantile方法,terra::global需要将所有单元格值加载到内存中。您不需要show(r)输入栅格,但我假设它相当大。如果你查看?global,你会看到这个警告:
如果x非常大,则全局将失败,除非fun是“mean”、“min”、“max”、“sum”、“prod”、“range”(最小值和最大值)、“rms”(均方根)、“sd”(样本标准差)、“std”(总体标准差)、“isNA”(NA的单元格数)、“notNA”(非NA的单元格数)中的一个。
我假设不允许您使用HPC中一个节点上的所有可用RAM,可能是因为它需要与多个内核共享。
如果你的栅格确实有很多像元,你可以取一个常规的样本,这对于很多应用来说应该足够接近(常规样本比空间数据的随机样本更有效)。

library(terra)
r <- rast(system.file("ex/elev.tif", package="terra"))
x <- spatSample(r, 10^6, "regular")
quantile(x, probs=c(0.05, 0.95), na.rm=TRUE)
# 5% 95% 
#232 489

请注意,terra::quantile方法返回各层中每个单元格的分位数。这种方法不太可能给予你的记忆问题,但它不是你所追求的,我想。

q <- quantile(c(r, r*2))

相关问题