ncvar_get не может выделить вектор размера для подмножества netcdf4 независимо от того, насколько он мал.

Я пытаюсь извлечь подмножество данных о глубине из глобального набора данных батиметрии океана GEBCO, который представляет собой .nc файл размером 10,9 ГБ, netcdf4 (прямая ссылка).

Я открываю соединение с файлом, который не загружает его в память:

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 У меня Linux-машина на 32 ГБ, так что все равно должно работать? [отредактируйте, и файл в первую очередь весит 10,9 ГБ, поэтому можно подумать, что подмножество будет меньше]

Любые идеи/информация/догадки с благодарностью принимаются. Заранее спасибо.

Редактировать: в других случаях это приводит к сбою RStudio, а не к ошибке. R Сеанс прерван, фатальная ошибка, сеанс завершен. Использование оперативной памяти было:

netcdfRAMfail


person dez93_2000    schedule 30.10.2019    source источник


Ответы (1)


Хорошо, решено. Оказывается, ответ, который я нашел в Интернете перед использованием [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")
person dez93_2000    schedule 30.10.2019