Xarray / Dask - 计算每个坐标的最高温度

Xarray / Dask - Compute the highest temperature for every coordinate

我有一个 17GB 的 GRIB 文件,其中包含 2020 年每小时的温度 (t2m) 数据。数据集的维度是 longitudelatitudetime.

我的目标是计算全年数据中每个坐标 (lon,lat) 的最高温度。我可以使用 Xarray 加载文件,但需要 4-5 分钟:

import xarray as xr
xarray_dataset = xr.open_dataset('cds/2020_hourly_t2m.grib', engine='cfgrib')

但是调用 xarray.Dataset.max() 会使 Google Colab 会话崩溃。这可能是因为它需要的内存超过可用内存。

所以,我可能需要使用 Dask 以块的形式加载数据并对这些块进行计算并汇总结果。我是 Dask 的新手,发现很难使用 Dask.Array API 分块读取气候数据集文件。我试过 dask.array.from_array( xarray_dataset.to_array() ) 但这也会导致会话崩溃。

我的问题是,我应该如何使用 Dask 分块读取这个 17GB 的 GRIB 文件,并计算数据集中每个经纬度对的全年最高温度?

xarray 具有 dask-集成,当提供 chunks kwarg 时激活。以下应该避免将数据集加载到内存中的需要:

import xarray as xr

ds = xr.open_dataset("cds/2020_hourly_t2m.grib", engine="cfgrib", chunks="auto")

test_lazy = ds.max()  # this is lazy
test_result = test_lazy.compute()  # actual result

请注意 ds.max() 上对 .compute() 的要求。这是因为对块进行操作会产生惰性结果,只有在明确请求时才会计算这些结果,请参阅 this tutorial.