【问题标题】:Writing a dask array to netcdf将 dask 数组写入 netcdf
【发布时间】:2018-05-22 16:16:47
【问题描述】:

我正在尝试将 dask 数组写入 netcdf 文件,但出现内存错误,我觉得有点奇怪,因为 dask 数组的大小不是太大。大约为 0.04 GB。其尺寸如下:

    <xarray.Dataset>
    Dimensions:    (latitude: 2000, longitude: 5143)
    Coordinates:

    * latitude   (latitude) float64 -29.98 -29.93 -29.88 -29.83 -29.78 -29.73 ...

    * longitude  (longitude) float64 -180.0 -179.9 -179.9 -179.8 -179.8 -179.7 ...

    Data variables:Tmax   (latitude, longitude) float32 

    **dask.array shape=(2000, 5143), chunksize=(2000, 5143)**

我也尝试过重新分块,但这也无济于事。如果您有任何提示,请告诉我。谢谢!

这是我如何生成要写入 netcdf 的 dask 数组。

    DATA = xr.open_mfdataset(INFILE, concat_dim='Month', autoclose=True)
    MONTH_MEAN = DATA.mean(dim='Month')

    DIFF_MEAN = ((MONTH_MEAN.isel(time=np.arange(17, 34))).mean(dim='time') -
    (MONTH_MEAN.isel(time=np.arange(17)))).mean(dim='time')

    OUTFILE = OUTFILE_template.format(CHIRTS_INDIR, DATA_LIST[c])

    DIFF_MEAN.to_netcdf(OUTFILE) 

包含所有输入文件数据的原始dask数组的DATA维度是:

   <xarray.Dataset>

   Dimensions:    (Month: 12, latitude: 2000, longitude: 5143, time: 34)

   Coordinates:
   * latitude   (latitude) float64 -29.98 -29.93 -29.88 -29.83 -29.78 -29.73 ...
   * longitude  (longitude) float64 -180.0 -179.9 -179.9 -179.8 -179.8 -179.7 ...
   * time       (time) datetime64[ns] 1983-12-31 1984-12-31 1985-12-31 ...

   Dimensions without coordinates: Month

   Data variables:
   Tmax       (Month, time, latitude, longitude) 
   float32 dask.array<shape=(12, 34, 2000, 5143), 
   chunksize=(1, 34, 2000, 5143)>

【问题讨论】:

  • 您能否添加有关如何制作此 dask 阵列的详细信息?很可能您的一些中间操作内存不足,而不是计算最终的 dask 数组。
  • 我刚刚添加了有关创建该 dask 数组的操作的更多详细信息。你说的对。我正在阅读一些大型数据集,并使用前 17 年和最后 17 年计算年平均值,最后计算得出 dask 数组的两者之间的平均值,我想写在 netcdf 中。

标签: dask python-xarray xarray


【解决方案1】:

数据集中的每个数组块都包含 34*2000*5143*4/1e9 = 1.4 GB 的数据。这对于使用 dask 数组来说相当大。根据经验,您希望能够在每个 CPU 内核上一次在内存中存储 5-10 个数组块。较小的块(~100 MB)可能会加快您的计算速度并减少内存需求。有关块大小的更多指南,请参阅 here

要使用 xarray/dask 调整块大小,请使用 open_mfdataset 中的 chunks= 参数,例如,

DATA = xr.open_mfdataset(INFILE, concat_dim='Month', autoclose=True,
                         chunks={'latitude': 1000, 'longitude': 1029})

【讨论】:

  • 太棒了。非常感谢!实际上,我只是尝试了 chunks={time:1},仅此一项就很有帮助,我现在将检查 lat 和 long 块如何帮助减少计算时间。
猜你喜欢
  • 2017-01-03
  • 1970-01-01
  • 2023-04-01
  • 2015-05-11
  • 2019-01-16
  • 2018-10-06
  • 2021-03-26
  • 1970-01-01
  • 2017-01-26
相关资源
最近更新 更多