[英]Change variable chunk of a Netcdf with R
在使用 R 處理大型 netcdf 文件(比計算機內存大)時,我經常會遇到同樣的問題。 沒有明顯的方法來更改數據塊。 這可能是我無法弄清楚如何在 R 中以有效方式完成的唯一 netcdf 常見任務。 我曾經根據情況使用 NCO 或 nccopy 來解決這個問題 go 。 甚至 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 的大小呈指數增長。
有誰知道如何更改 R 中的 nc 文件塊,其大小大於計算機 memory?
這取決於你的目的。 如果您需要提取/分析“map-wise”切片(即在 lat-lon 矩陣上),則將分塊策略保持在空間坐標上。 但是,如果您希望進行時間分析(例如提取每個網格單元的時間序列以計算趨勢),那么我的建議是將您的分塊策略切換到時間維度。
嘗試通過將chunksizes=c(100,100,1)
替換為類似chunksizes=c(10,10,1000)
=c(10,10,1000) 的內容來重新運行代碼。 這樣,時間序列讀取變得更快。
如果您的代碼在 R 中真的很慢,您可以嘗試更快的替代方案,例如(例如) nccopy
或nco
。
您可以使用如下簡單的nccopy
命令重新分塊您的 netcdf 文件: nccopy -c time/1000,lat/10,lon/10 input.nc output.chunked.nc
在nco
中(我建議在nccopy
上進行此操作),您可以執行以下操作:
nco -O -4 -D 4 --cnk_plc g2d --cnk_dmn lat,10 --cnk_dmn lon,10 --cnk_dmn time,1000 in.nc out.nc
將--cnk_dmn
指定給您感興趣的塊大小的特定變量。 更多示例見 http://nco.sourceforge.net/nco.html#Chunking 。
無論哪種方式,您都必須對不同的塊大小進行一些嘗試,以確定最適合您的特定情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.