在使用ncvar_get阅读文件之前,从THREDDS数据服务器计算子集大型netCDF文件的大小(字节)?

3qpi33ja  于 2023-01-03  发布在  Etcd
关注(0)|答案(1)|浏览(207)

我使用nc_open从THREDDS数据服务器获取DatasetNode,并通过指定startcount阅读ncvar_get中数据的子集。

library(thredds)
library(ncdf4)

Top <- CatalogNode$new("https://oceanwatch.pifsc.noaa.gov/thredds/catalog.xml") 
DD <- Top$get_datasets() 
dnames <- names(DD)
dname <- dnames[4] # "Chlorophyll a Concentration, Aqua MODIS - Monthly, 2002-present. v.2018.0"   
D <- DD[[dname]]

dl_url <- file.path("https://oceanwatch.pifsc.noaa.gov/thredds/dodsC", D$url)
dataset <- nc_open(dl_url)

dataset_lon <- ncvar_get(dataset, "lon") # Get longitude values
dataset_lat <- ncvar_get(dataset, "lat")  # Get latitude values
dataset_time <- ncvar_get(dataset, "time") # get time values in tidy format

# specify lon/lat boundaries for data subset:
lonmin = 160
lonmax = 161
latmin = -1
latmax = 0

LonIdx <- which(dataset_lon >= lonmin & dataset_lon <= lonmax)
LatIdx <- which(dataset_lat >= latmin & dataset_lat <= latmax)

# read the data for first 10 timesteps:
dataset_array <- ncvar_get(dataset, 
  start=c(findInterval(lonmin, dhw_lon), findInterval(latmax, sort(dhw_lat)), 1), 
  count=c(length(LonIdx), length(LatIdx), 10), varid="chlor_a", verbose=TRUE)

在阅读数据之前,是否有方法计算ncvarget的近似文件大小?

nle07wnf

nle07wnf1#

非常感谢@michael-delgado和@robert-wilson的上述评论,我编辑了最初的帖子,加入了一个可复制的例子,并回答了我自己的问题,以防它对以后的其他人有帮助。
如果我理解正确的话,目前所有的R实现都使用float 32。使用上面帖子中的Aqua MODIS叶绿素数据集:
使用ncvar_get下载数据之前**文件大小的上限(假设没有NA)**为23,040字节:

(length(LonIdx) * length(LatIdx) * 10) * 4 # based on 10 time steps

这与下载后数据的大小有关:

(dim(dataset_array)[1] * dim(dataset_array)[2] * dim(dataset_array)[3]) * 4

将输出数组写入磁盘将生成一个20,444字节的文件:

dataset_output <-  as.data.frame.table(dataset_array)
saveRDS(dataset_output, "dataset_output.rds")

这接近于计算的上限(23,040字节)。对我来说,这种方法对于在使用ncvar_get下载数据之前获得上限和近似大小非常有用,非常感谢你们两个。
(Out在上面的例子中,排除NA,剩下5760个单元中的4559个:(sum(!is.na(dataset_array)) * 4),它给出18,236字节,小于实际文件大小(20,444字节)。

相关问题