使用Xarray绘制2D数据花费了相当长的时间?

时间:2018-03-14 07:16:35

标签: python netcdf dask python-xarray xarray

我正在使用xarray阅读NetCDF文件。每个变量都有4个维度( Times,lev,y,x )。阅读变量后,我计算变量 QVAPOR 平均值 时间,列举< / strong>)尺寸。经过计算后,我得到变量 QVAPOR_mean 这是一个有形状的二维变量( y:699,x:639

  

Xarray只花了10微秒来读取形状数据(时间:2918,左:36,y:699,x:639 );但花了不止    60分钟 绘制形状数据的填充轮廓( y:699,x:639 )。

我想知道Xarray如何花费很长时间(超过60分钟)来绘制具有大小的数组的轮廓f( 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多个小时才能完成。感谢帮助。 谢谢

1 个答案:

答案 0 :(得分:1)

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

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调度程序适用于这些应用程序。