Регулярно я сталкиваюсь с одной и той же проблемой при использовании R для работы с большими файлами netcdf (больше, чем память компьютера). Не существует очевидного способа изменить фрагмент данных. Это, вероятно, единственная общая задача netcdf, которую я не могу понять, как сделать это эффективным способом в R. Раньше я решал эту проблему, используя NCO или nccopy, в зависимости от ситуации. Даже CDO имеет возможность копировать nc, изменяя фрагмент, но гораздо менее гибкий, чем предыдущие инструменты. Мне интересно, есть ли какой-нибудь эффективный способ сделать это в R.
В следующем примере создается игрушка nc, разделенная на Chunking: [100,100,1]
.
library(ncdf4)
foo_nc_path=paste0(tempdir(),"/thing.nc")
xvals <- 1:100
yvals <- 1:100
lon <- ncdim_def("longitude", "Km_east", xvals)
lat <- ncdim_def("latitude", "Km_north", yvals)
time <- ncdim_def("Time","hours", 1:1000, unlim=TRUE)
var<- ncvar_def("foo_var", "nothing", list(lon, lat, time), chunksizes=c(100,100,1),
longname="xy chunked numbers", missval=-9)
foo_nc <- nc_create(foo_nc_path, list(var))
data <- array(runif(100*100*1000),dim = c(100,100,1000))
ncvar_put(foo_nc, var, data)
nc_close(foo_nc)
####Check speed
foo_nc <- nc_open(foo_nc_path)
system.time({timestep <- ncvar_get(foo_nc,"foo_var",start = c(1,1,1),count=c(-1,-1,1))})
system.time({timeserie <- ncvar_get(foo_nc,"foo_var",start = c(1,1,1),count=c(1,1,-1))})
Как видите, время чтения для timeserie
намного больше, чем для timestep
var.
Разница во времени экспоненциально увеличивается с размером .nc.
Кто-нибудь знает способ изменить фрагмент файла nc в R, размер которого больше, чем память компьютера?