我有几个大约 100 GB 的 NetCDF 文件。
在每个 NetCDF 文件中,都有一个变量 a
,我必须从中提取几个数据系列
尺寸为(1440,721,6,8760)
。
我需要从每个 NetCDF 文件中提取大约 20k 维 (1,1,1,8760)
切片。
由于提取一片切片的速度非常慢(几分钟),因此我阅读了有关如何优化该过程的信息。
最有可能的是, block 没有被最佳设置。
因此,我的目标是将 block 大小更改为 (1,1,1,8760)
以获得更高效的 I/O。
但是,我很难理解如何最好地重新划分这个 NetCDF 变量。
首先,通过运行ncdump -k file.nc
,我发现类型是64位偏移量
。
根据我的研究,我认为这是 NetCDF3,它不支持定义 block 大小。
因此,我使用 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
看看是否更快。
关于python - 更改 netCDF 文件中的 chunk block 形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72893340/