更改 netCDF 文件中的 chunk 块形状

问题描述 投票:0回答:2

我有几个大约 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) 的强大服务器上完成。

python matlab netcdf netcdf4
2个回答
3
投票

您的命令似乎是正确的。重新分块需要时间。

ncks -4 --cnk_dmn latitude,1 --cnk_dmn longitude,1 --cnk_dmn level,1 --cnk_dmn time,8760 in.nc out.nc

看看是否更快。


0
投票

这里是一个老问题,但我在其他地方没有找到更多信息。我必须重新分块大小为 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}})
© www.soinside.com 2019 - 2024. All rights reserved.