问题描述
我正在尝试对数据集执行一个相当简单的操作,包括在每个 3.5GB 的单个 netcdf 文件上编辑变量和全局属性。文件使用 xr.open_dataset
立即加载,但 dataset.to_netcdf()
修改后导出速度太慢。
我试过了:
我正在开发具有 10 个分布式工作器的 HPC。在所有情况下,每个文件花费的时间都超过 15 分钟。是预期的吗?除了使用 dask 延迟进一步并行化单个文件操作之外,我还能尝试什么来加速这个过程?
解决方法
首先简要说明:
使用 xr.open_dataset 立即加载文件
您可能此时实际上并未加载数据,仅加载了元数据。根据您的 IO 和压缩/编码,加载数据可能需要相当多的 CPU 和内存。您应该知道您认为单个 CPU 线程应该花费多少时间。
回答我们的问题: netCDF (HDF5) 不能很好地处理并行写入。您可能会发现由于锁定,一次只有一个任务正在写入,或者甚至在写入之前输出数据都将转到单个任务,而不管您的分块如何。请检查您的 dask 仪表板!
我建议您尝试 zarr 格式,它适用于并行应用程序,因为每个块都在不同的文件中。您仍然需要决定正确的数据分块 (example)。