0

我正在使用 xarray 读取 NetCDF 文件。每个变量有 4 个维度(Times, lev, y, x)。读取变量后,我沿 ( Times,lev ) 维度计算变量QVAPOR的平均值。计算后,我得到变量QVAPOR_mean,它是一个具有形状(y: 699, x: 639)的二维变量。

Xarray 只需 10 微秒即可读取形状数据(Times:2918, lev:36, y:699, x:639);但是花了 60 多分钟来绘制形状数据的填充轮廓(y: 699, x: 639)。

我想知道 Xarray 怎么会花费很长时间(超过 60 分钟)来绘制大小为(y: 699, x: 639)的数组的轮廓。

我使用以下代码来读取文件并执行计算。

flnm=xr.open_mfdataset('./WRF_3D_2007_*.nc',chunks={'Times': 100})
QVAPOR_mean=flnm.QVAPOR.mean(dim=('Times','lev')
QVAPOR_mean.plot.imshow()

最后一个命令需要 60 多分钟才能完成。帮助表示赞赏。谢谢你

4

1 回答 1

1

当您打开数据集并提供chunks参数时, xarray 将返回一个Dataset由 dask 数组组成的。这些数组被“懒惰地”评估(xarray/dask 文档)。直到您绘制数据才会触发计算。为了说明这一点,您可以在取平均值后显式加载数据:

flnm=xr.open_mfdataset('./WRF_3D_2007_*.nc',chunks={'Times': 100})
QVAPOR_mean=flnm.QVAPOR.mean(dim=('Times','lev').load()

现在您的QVAPOR_mean变量由 numpy 数组而不是 dask 数组支持。绘制这个数组可能会快得多。

但是,您的计算mean可能仍需要相当长的时间。这里也有一些方法可以提高吞吐量。

  • 尝试使用更大的块大小。我经常发现 10-100Mb 范围内的块大小表现最好。

  • 尝试不同的调度程序。默认情况下,您使用 dask 的线程调度程序。由于 netCDF/HDF 的限制,这不允许从磁盘并行读取。我们一直发现distributed调度程序适用于这些应用程序。

于 2018-03-14T16:58:52.227 回答