在 rioxarray 中使用 Dask 进行大写操作的内存错误

问题描述

关于堆栈的第一个问题!

我正在处理一个数据集非常大的问题。我正在尝试使用 rioxarray(分块,与 dask)将大量 geotiff(据我所知不是 COG)组合在一起,将它们连接起来,并将它们保存为 netCDF。当我尝试写入文件时遇到问题。我在本地系统上做这个分析,所以我没有很多内核可以使用,但我的印象是有一些设置可以使它这样,只要数据足够大以适应磁盘,dask 可以将作业排队,以便它们适合内存。每个栅格大小为 2,060 KB,并以每天的时间步长存储在磁盘上 28 年,即:(2,060 * 365) * 28 KB!

当我减少文件数量时,我使用以下代码成功。 我从帖子中得到了这个一般模式:

convert-raster-time-series-of-multiple-geotiff-images-to-netcdf

determining chunks
path 
C:\Users\gparrish\Documents\Drought\gridmet\eto1998321.tif
xras dimensions ('band','y','x')
4120
1629
opening
done reading in eto
<xarray.DataArray (time: 6998,band: 1,y: 1629,x: 4120)>
dask.array<concatenate,shape=(6998,1,1629,4120),dtype=float32,chunksize=(1,chunktype=numpy.ndarray>
Coordinates:
  * band         (band) int32 1
  * x            (x) float64 -103.0 -103.0 -103.0 ... -94.44 -94.43 -94.43
  * y            (y) float64 37.0 37.0 37.0 37.0 ... 33.62 33.62 33.62 33.62
    spatial_ref  int32 0
  * time         (time) datetime64[ns] 1998-11-17 1998-11-18 ... 2018-01-01
Attributes:
    scale_factor:  1.0
    add_offset:    0.0
writing to file


Traceback (most recent call last):
  File "C:\Users\gparrish\PycharmProjects\xarray_sandBox\preprocessing\xarr_make_NCDF_ds.py",line 136,in <module>
    delayed_obj = gridmet_dset.to_netcdf(path=r'C:\Users\gparrish\Documents\Drought\gm_eto.nc',compute=False)
  File "C:\ProgramData\Anaconda3\envs\xarr_env\lib\site-packages\xarray\core\dataarray.py",line 2778,in to_netcdf
    return dataset.to_netcdf(*args,**kwargs)
  File "C:\ProgramData\Anaconda3\envs\xarr_env\lib\site-packages\xarray\core\dataset.py",line 1799,in to_netcdf
    return to_netcdf(
  File "C:\ProgramData\Anaconda3\envs\xarr_env\lib\site-packages\xarray\backends\api.py",line 1076,in to_netcdf
    dump_to_store(
  File "C:\ProgramData\Anaconda3\envs\xarr_env\lib\site-packages\xarray\backends\api.py",line 1123,in dump_to_store
    store.store(variables,attrs,check_encoding,writer,unlimited_dims=unlimited_dims)
  File "C:\ProgramData\Anaconda3\envs\xarr_env\lib\site-packages\xarray\backends\common.py",line 266,in store
    self.set_variables(
  File "C:\ProgramData\Anaconda3\envs\xarr_env\lib\site-packages\xarray\backends\common.py",line 304,in set_variables
    target,source = self.prepare_variable(
  File "C:\ProgramData\Anaconda3\envs\xarr_env\lib\site-packages\xarray\backends\scipy_.py",line 223,in prepare_variable
    self.ds.createVariable(name,data.dtype,variable.dims)
  File "C:\ProgramData\Anaconda3\envs\xarr_env\lib\site-packages\scipy\io\netcdf.py",line 388,in createVariable
    data = empty(shape_,dtype=type.newbyteorder("B"))  # convert to big endian always for NetCDF 3
numpy.core._exceptions.MemoryError: Unable to allocate 175. GiB for an array with shape (6998,4120) and data type >f4

我是否遗漏了一些可以防止进程中断的设置?我想我必须更具体地说明如何指导 dask 解决问题...

'Done reading in eto' 总是打印,所以在数组中读取没有问题,但是,当我尝试写入 netCDF 时,我遇到了问题:

$any

我的 chunksize 是不是太大了?我应该实例化 dask.distributed.Client() 吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...