【问题标题】:Plotting 2D data using Xarray takes a surprisingly long time?使用 Xarray 绘制 2D 数据需要很长时间?
【发布时间】:2018-03-14 07:16:35
【问题描述】:

我正在使用 xarray 读取 NetCDF 文件。每个变量都有 4 个维度(Times, lev, y, x)。读取变量后,我计算变量 QVAPOR 沿 (Times,lev) 尺寸。计算后我得到变量 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 多分钟才能完成。帮助表示赞赏。 谢谢你

【问题讨论】:

  • 您的总数据集有多大,以 GB 为单位? 2918 * 36 * 699 * 639 * 8 / 2**30 = 350GB ?您可以使用块大小,但我不确定您可以期望多好。
  • 是的,大约是 350 GB。我已经沿Time 维度存储数据。计算速度非常快,唯一的问题是绘图。 Python 绘制形状为(y: 699, x: 639) 的数据不应超过几秒钟。我想知道发生了什么?

标签: python netcdf dask python-xarray xarray


【解决方案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 调度程序非常适合这些应用程序。

【讨论】:

    猜你喜欢
    • 2020-10-03
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2013-11-24
    • 1970-01-01
    • 2013-08-13
    相关资源
    最近更新 更多