首页 > 解决方案 > 尝试将由 dask 数组块组成的 xarray 数据集加载到内存时出现内存/xarray/dask 错误?

问题描述

第一次发布问题,所以如果需要,请毫不犹豫地指出添加/更正。另外,我不确定这是否真的是一个错误,所以如果您认为是,我将在 xarray/dask GitHub 上重定向我的问题。我也是 xarray 的新手,我来自 matlab,但试图过渡到 python。所以在这里......我正在使用 xarray 打开两年的每小时数据,并按照以下代码对其进行子集化:

ds=xr.open_mfdataset('F:/supdude/datatest/*', combine='by_coords')
ds=ds.sel(longitude=slice(-145+360,-52+360), latitude=slice(70,41))

完成后,数据集如下所示:

<xarray.Dataset>
Dimensions:     (latitude: 117, longitude: 373, time: 17544)
Coordinates:
  * longitude   (longitude) float32 215.0 215.25 215.5 ... 307.5 307.75 308.0
  * latitude    (latitude) float32 70.0 69.75 69.5 69.25 ... 41.5 41.25 41.0
  * time        (time) datetime64[ns] 1979-01-01 ... 1980-12-31T23:00:00
Data variables:
    d2m         (time, latitude, longitude) float32 dask.array<chunksize=(8760, 117, 373), meta=np.ndarray>

然后,我继续使用简单的重采样方法将其降低到每天的基础上,并归结为这一点(我有两个类似这样的 xarray 数据集):

<xarray.Dataset>
Dimensions:    (latitude: 117, longitude: 373, time: 731)
Coordinates:
  * time       (time) datetime64[ns] 1979-01-01 1979-01-02 ... 1980-12-31
  * longitude  (longitude) float32 215.0 215.25 215.5 ... 307.5 307.75 308.0
  * latitude   (latitude) float32 70.0 69.75 69.5 69.25 ... 41.5 41.25 41.0
Data variables:
    d2m        (time, latitude, longitude) float32 dask.array<chunksize=(1, 117, 373), meta=np.ndarray>

问题来了。我更改了重采样工作流程以使其更快,并且我正在尝试比较新重采样方法和前一个重采样方法的结果,因此我确信我的新方法会产生正确的结果,但为了做到这一点,我需要加载我的 xarray数据集到我的内存中,以便我可以访问变量“d2m”中的数据。为此,我使用:

ds.load() / ds.compute()

运行时,我收到以下内存错误(最后的完整回溯):

MemoryError: Unable to allocate 17.0 GiB for an array with shape (8784, 721, 1440) and data type >i2

这似乎很离谱,因为这是全世界年度文件的大小。从技术上讲,我重采样后的数据集应该是每年大约 500 MB(总共 1Gb),正如您在上面看到的,重采样后的完整形状是(117、373、731)所以不知道为什么使用“.load()”产生形状错误(8784、721、1440)。我的计算机只有 16Gb 的 RAM,所以我尝试在具有 64Gb 的计算机上执行此操作(所以从技术上讲,我应该能够直接在内存上打开两年(每年 17Gb)而不使用 dask),但是当我尝试使用“.load()”,它填满了整个 64Gb 或 RAM 并使计算机崩溃。现在这只是一个测试,在不久的将来我将不得不处理更大的数据集,所以我真的不能在没有 dask 的情况下在具有 64Gb RAM 的计算机上打开这些数据集。进一步的测试表明,只有当我已经在数组上使用了“.load()”时才会出现这个问题(即我想加载两个数组来比较它们,如果它在一个新内核中,第一个将加载并添加~1Gb 在我的 RAM 上,当我尝试加载第二个时,我得到了内存错误)。我对 dask 了解不多,而且我在网上发现的所有问题都与我在这里得到的内容没有直接关系……也许与调度程序有关,但不确定。有任何想法吗??对 dask 了解不多,而且我在网上发现的所有问题都与我在这里得到的内容没有直接关系……也许与调度程序有关,但不确定。有任何想法吗??对 dask 了解不多,而且我在网上发现的所有问题都与我在这里得到的内容没有直接关系……也许与调度程序有关,但不确定。有任何想法吗??

完整追溯:

Traceback (most recent call last):

  File "<ipython-input-42-88724a7ac66e>", line 1, in <module>
    new.compute()

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\core\dataset.py", line 807, in compute
    return new.load(**kwargs)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\core\dataset.py", line 651, in load
    evaluated_data = da.compute(*lazy_data.values(), **kwargs)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\dask\base.py", line 437, in compute
    results = schedule(dsk, keys, **kwargs)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\dask\threaded.py", line 84, in get
    **kwargs

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\dask\local.py", line 486, in get_async
    raise_exception(exc, tb)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\dask\local.py", line 316, in reraise
    raise exc

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\dask\local.py", line 222, in execute_task
    result = _execute_task(task, data)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\dask\core.py", line 118, in _execute_task
    args2 = [_execute_task(a, cache) for a in args]

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\dask\core.py", line 118, in <listcomp>
    args2 = [_execute_task(a, cache) for a in args]

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\dask\core.py", line 118, in _execute_task
    args2 = [_execute_task(a, cache) for a in args]

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\dask\core.py", line 118, in <listcomp>
    args2 = [_execute_task(a, cache) for a in args]

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\dask\core.py", line 119, in _execute_task
    return func(*args2)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\dask\array\core.py", line 106, in getter
    c = np.asarray(c)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\numpy\core\_asarray.py", line 85, in asarray
    return array(a, dtype, copy=False, order=order)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\core\indexing.py", line 491, in __array__
    return np.asarray(self.array, dtype=dtype)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\numpy\core\_asarray.py", line 85, in asarray
    return array(a, dtype, copy=False, order=order)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\core\indexing.py", line 653, in __array__
    return np.asarray(self.array, dtype=dtype)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\numpy\core\_asarray.py", line 85, in asarray
    return array(a, dtype, copy=False, order=order)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\core\indexing.py", line 557, in __array__
    return np.asarray(array[self.key], dtype=None)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\numpy\core\_asarray.py", line 85, in asarray
    return array(a, dtype, copy=False, order=order)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\coding\variables.py", line 72, in __array__
    return self.func(self.array)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\coding\variables.py", line 218, in _scale_offset_decoding
    data = np.array(data, dtype=dtype, copy=True)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\coding\variables.py", line 72, in __array__
    return self.func(self.array)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\coding\variables.py", line 138, in _apply_mask
    data = np.asarray(data, dtype=dtype)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\numpy\core\_asarray.py", line 85, in asarray
    return array(a, dtype, copy=False, order=order)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\core\indexing.py", line 557, in __array__
    return np.asarray(array[self.key], dtype=None)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\backends\netCDF4_.py", line 73, in __getitem__
    key, self.shape, indexing.IndexingSupport.OUTER, self._getitem

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\core\indexing.py", line 837, in explicit_indexing_adapter
    result = raw_indexing_method(raw_key.tuple)

  File "C:\Users\Psybot\Anaconda3\lib\site-packages\xarray\backends\netCDF4_.py", line 85, in _getitem
    array = getitem(original_array, key)

  File "netCDF4\_netCDF4.pyx", line 4408, in netCDF4._netCDF4.Variable.__getitem__

  File "netCDF4\_netCDF4.pyx", line 5335, in netCDF4._netCDF4.Variable._get

MemoryError: Unable to allocate 17.0 GiB for an array with shape (8784, 721, 1440) and data type >i2

标签: pythondaskpython-xarray

解决方案


推荐阅读