我有几个大约 100 GB 的 NetCDF 文件。 在每个 NetCDF 文件中,都有一个变量
a
,我必须从中提取几个数据系列
尺寸为(1440,721,6,8760)
。
我需要从每个 NetCDF 文件中提取约 20k 尺寸为 (1,1,1,8760)
的切片。
由于提取一片切片的速度非常慢(几分钟),因此我阅读了有关如何优化该过程的信息。
最有可能的是,这些块没有被最佳设置。
因此,我的目标是将块大小更改为(1,1,1,8760)
以获得更高效的 I/O。
但是,我很难理解如何最好地重新划分这个 NetCDF 变量。 首先,通过运行
ncdump -k file.nc
,我发现类型是64-bit offset
。
根据我的研究,我认为这是 NetCDF3,它不支持定义块大小。
因此,我使用nccopy -k 3 source.nc dest.nc
将其复制为NetCDF4格式。
ncdump -k file.nc
现在返回 netCDF-4
。
然而,现在我被困住了。我不知道如何继续。
如果有人在 python、matlab 或使用 nccopy 中有正确的解决方案,请分享。 我现在正在尝试的是以下内容:
nccopy -k 3 -w -c latitude/1,longitude/1,level/1,time/8760 source.nc dest.nc
这在理论上是正确的方法吗? 不幸的是,24 小时后,它仍然没有在具有足够 RAM (250GB) 和许多 CPU (80) 的强大服务器上完成。
您的命令似乎是正确的。重新分块需要时间。
ncks -4 --cnk_dmn latitude,1 --cnk_dmn longitude,1 --cnk_dmn level,1 --cnk_dmn time,8760 in.nc out.nc
看看是否更快。
这里是一个老问题,但我在其他地方没有找到更多信息。我必须重新分块大小为 25 GB(解压缩)的文件,并尝试了 ncks 和 nccopy。我认为 nccopy 确实有效,但花了大约 48 小时。
我最终使用了 xarray 和 python,结果证明它要快得多。 25 GB 在不到 5 分钟内重新分块(包括压缩)。内存使用量约为 75 GB。这是我使用过的方法:
import xarray as xr
ds = xr.open_dataset('field_access_opt.nc') # chunks (time,lat,lon): 1,500,1000
#re-chunk variable 'GHI'
ds.to_netcdf("point_access_opt.nc",
encoding={'lat': {'zlib': False, '_FillValue': None},
'lon': {'zlib': False, '_FillValue': None},
'time': {'zlib': False, '_FillValue': None, 'dtype': 'double'},
'GHI': {'chunksizes': [len(ds['GHI'].time),1,1], 'zlib': True,
'complevel': 1}})