将dask数组写入netcdf

将dask数组写入netcdf,dask,python-xarray,xarray,Dask,Python Xarray,Xarray,我试图将一个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 -2

我试图将一个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)**
包含所有输入文件数据的原始dask数组的数据维度为:

   <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)>

尺寸:(月:12,纬度:2000,经度:5143,时间:34)
协调:
*纬度(纬度)浮动64-29.98-29.93-29.88-29.83-29.78-29.73。。。
*经度(经度)浮动64-180.0-179.9-179.9-179.8-179.8-179.7。。。
*时间日期时间64[ns]1983-12-311984-12-311985-12-31。。。
不带坐标的尺寸:月
数据变量:
Tmax(月、时间、纬度、经度)
float32 dask.array

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

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

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

您可以添加有关如何制作此dask阵列的详细信息吗?很可能是由于某些中间操作的内存不足,而不是计算最终的dask数组。我刚刚添加了有关创建该dask数组的操作的更多详细信息。你说得很对。我正在阅读一些大型数据集,计算前17年和后17年的年平均值,最后计算两者之间的平均值,结果是dask数组,我想用netcdf.Great来写。非常感谢!实际上,我刚刚用chunk={time:1}进行了实验,仅此一项就起到了很大的作用,现在我将检查lat和long chunk如何帮助减少计算时间。
DATA = xr.open_mfdataset(INFILE, concat_dim='Month', autoclose=True,
                         chunks={'latitude': 1000, 'longitude': 1029})