在尝试计算大型光栅文件(.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
1条答案
按热度按时间bcs8qyzn1#
要获取栅格图层所有像元的分位数,可以执行以下操作
您遇到的问题是,要使用
stats::quantile
方法,terra::global
需要将所有单元格值加载到内存中。您不需要show(r)
输入栅格,但我假设它相当大。如果你查看?global
,你会看到这个警告:如果x非常大,则全局将失败,除非fun是“mean”、“min”、“max”、“sum”、“prod”、“range”(最小值和最大值)、“rms”(均方根)、“sd”(样本标准差)、“std”(总体标准差)、“isNA”(NA的单元格数)、“notNA”(非NA的单元格数)中的一个。
我假设不允许您使用HPC中一个节点上的所有可用RAM,可能是因为它需要与多个内核共享。
如果你的栅格确实有很多像元,你可以取一个常规的样本,这对于很多应用来说应该足够接近(常规样本比空间数据的随机样本更有效)。
请注意,terra::quantile方法返回各层中每个单元格的分位数。这种方法不太可能给予你的记忆问题,但它不是你所追求的,我想。