ncvar_get "не может выделить вектор размера" для подмножества netcdf4, независимо от того, насколько мал - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь извлечь подмножество данных глубины из набора глобальных данных батиметрии океана GEBCO, который представляет собой файл размером 10,9 ГБ .nc, 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

1 Ответ

0 голосов
/ 30 октября 2019

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