ncvar_get“无法分配大小的向量”为netcdf4子集,无论多么小

问题描述 投票:0回答:1

[我正在尝试从GEBCO的全球海洋测深数据集中提取深度数据的子集,该数据集是10.9gb的.nc文件netcdf4direct link)。

我打开了到文件的连接,但没有将其加载到内存中:

library(ncdf4)
GEBCO <- nc_open(filename = "GEBCO_2019.nc", verbose = T)

查找与我的子集区域相对应的经纬度索引:

LonIdx <- which(GEBCO$dim$lon$vals < -80 & GEBCO$dim$lon$vals > -81.7) #n=408 long
LatIdx <- which(GEBCO$dim$lat$vals < 26 & GEBCO$dim$lat$vals > 25) #n=240; 240*408=97920

然后获得这些范围的Z数据:

z <- ncvar_get(GEBCO, GEBCO$var$elevation)[LonIdx, LatIdx]

结果:

Error: cannot allocate vector of size 27.8gb

但是无论子集的大小如何,它都会这样做,甚至可以缩小到14 * 14的矩阵。因此,我认为ncvar_get()正在拉整个数据库以提取索引...即使我印象中netcdf文件的全部要点是您可以使用矩阵索引来提取而不加载整个对象记忆?

FWIW我在32gb的Linux机器上,所以仍然可以正常工作? [编辑,文件首先是10.9gb,所以人们会认为一个子集会更小]]

非常感谢收到的任何想法/见解/见解。预先感谢。

编辑:其他时候它使RStudio崩溃而不是给出错误。 R会话异常终止,致命错误,会话终止。 RAM使用情况为:

netcdfRAMfail

r bigdata extract netcdf netcdf4
1个回答
0
投票

好,解决了。提出了我在使用[LonIdx, LatIdx]之前在网上找到的答案,然后将整个内容读取到内存中。尽管我仍然不知道为什么这是一个问题,因为它的文件大小是我的内存的三分之一,并且扩展大小在我的内存之内,但这仍然是错误的方法。

假设行和列是连续的(它们应该在netcdf中),解决方案是:

z <- ncvar_get(nc = GEBCO,
               varid = GEBCO$var$elevation,
               start = c(LonIdx[1],
                         LatIdx[1]),
               count = c(length(LonIdx),
                         length(LatIdx)),
               verbose = T)

要转换为长格式:

lon <- GEBCO$dim$lon$vals[LonIdx]
lat <- GEBCO$dim$lat$vals[LatIdx]
rownames(z) <- as.character(lon)
colnames(z) <- as.character(lat)
library(tidyr)
library(magrittr)
ztbl <- as_tibble(z, rownames = "lon")
ztbl %<>% pivot_longer(-lon, names_to = "lat", values_to = "depth")
© www.soinside.com 2019 - 2024. All rights reserved.