写入 netCDF 文件非常慢

问题描述

我正在尝试对数据集执行一个相当简单的操作,包括在每个 3.5GB 的单个 netcdf 文件上编辑变量和全局属性文件使用 xr.open_dataset 立即加载,但 dataset.to_netcdf() 修改后导出速度太慢。 我试过了:

  1. 无需重新组块和 dask 调用
  2. 不同的块大小,后跟:
  3. load()之前使用to_netcdf
  4. persist()之前使用compute ()to_netcdf

我正在开发具有 10 个分布式工作器的 HPC。在所有情况下,每个文件花费的时间都超过 15 分钟。是预期的吗?除了使用 dask 延迟进一步并行化单个文件操作之外,我还能尝试什么来加速这个过程?

解决方法

首先简要说明:

使用 xr.open_dataset 立即加载文件

可能此时实际上并未加载数据,仅加载了元数据。根据您的 IO 和压缩/编码,加载数据可能需要相当多的 CPU 和内存。您应该知道您认为单个 CPU 线程应该花费多少时间。

回答我们的问题: netCDF (HDF5) 不能很好地处理并行写入。您可能会发现由于锁定,一次只有一个任务正在写入,或者甚至在写入之前输出数据都将转到单个任务,而不管您的分块如何。请检查您的 dask 仪表板!

我建议您尝试 zarr 格式,它适用于并行应用程序,因为每个块都在不同的文件中。您仍然需要决定正确的数据分块 (example)。