簡體   English   中英

使用 R 更改 Netcdf 的變量塊

[英]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 中真的很慢,您可以嘗試更快的替代方案,例如(例如) nccopynco

您可以使用如下簡單的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM