我正在尝试将一个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)>
答案 0 :(得分:0)
数据集中的每个数组块都包含34*2000*5143*4/1e9 = 1.4 GB
个数据。这对于使用dask数组来说相当大。根据经验,您希望每个CPU核心能够同时在内存中存储5-10个数组块。较小的块(~100 MB)可能会加快您的计算速度并降低内存需求。有关块大小的更多指导,请参阅here。
要使用xarray / dask调整块大小,请使用chunks=
中的open_mfdataset
参数,例如,
DATA = xr.open_mfdataset(INFILE, concat_dim='Month', autoclose=True,
chunks={'latitude': 1000, 'longitude': 1029})