dask:大块的xarray数据集未正确共享ammgst worker

问题描述 投票:0回答:1

情况

我有一个很大的NetCDF文件,其中包含一些Earth System模型数据。我通过xarray访问文件和数据,并希望通过分布在多个工作程序上的dask处理一个变量(进行一些计算)。 xarray变量按以下方式分块:可以在每个分块上单独执行处理,而无需其他分块提供信息。块数等于工人数。定义好计算后,我叫compute()。完整的分块变量似乎已发送给每个工作程序(请参见下面的示例)。相反,我希望每个工人只能得到一个块a来执行其计算。

我缺少重要的东西,但我不知道。

最小示例

您可以在专用的GitHub存储库中找到文件和一个jupyter笔记本:https://github.com/neumannd/issue_usage_dask

启动两个工作程序,每个工作程序获得RAM的350 MB。我的xarray数据集的大小为395.5 MB,并分为197.75 MB大小的两个块。以可以单独执行操作(mean(dim='time'))的方式进行拆分。但是,工作者崩溃的原因是,数据的存储量95%超过了其内存的332.5 MB。这意味着它们不仅接收一个块,而且接收整个变量。

在这个最小的示例中,这不是问题(我可以创建工作人员的内存)。但是,如果数据集的大小为8 GB,并且四个工作线程中的每个都必须具有8 GB内存,或者如果我使用一个n > 10大小的xarray数据集来工作一个x > 10 GB工作线程,则我将占用n * x > 100 GB内存,对于增加nx而言,这非常糟糕。

# load libraries
import xarray as xr
import dask
from dask.distributed import Client

# set path of data
data_file = "/home/k204221/large_data/more_netcdf/CMAQ_t_zoo_59_1.nc"

# initialize workers
client = Client(n_workers=2, threads_per_worker=1,
                memory_limit='350MB', dashboard_address=':8787')
client

enter image description here

# open data file
ds = xr.open_dataset(data_file, chunks = {"xt_ocean": 112, "yt_ocean": 242})
t_zoo = ds.t_zoo
t_zoo.data

enter image description here

# process data
zoo_mean_delay = t_zoo.mean(dim = 'time')
zoo_mean_delay
## output
# <xarray.DataArray 't_zoo' (st_ocean: 152, yt_ocean: 242, xt_ocean: 224)>
# dask.array<mean_agg-aggregate, shape=(152, 242, 224), dtype=float32, chunksize=(152, 242, 112)>
# Coordinates:
#   * xt_ocean  (xt_ocean) float64 8.283 8.383 8.483 8.583 ... 30.38 30.48 30.58
#   * yt_ocean  (yt_ocean) float64 53.86 53.91 53.96 54.01 ... 65.81 65.86 65.91
#   * st_ocean  (st_ocean) float64 0.25 0.7508 1.257 1.771 ... 263.0 265.0 267.0

# I tried to explicitely list the workers in the call of compute
#  hoping to let it work this way
zoo_mean_comp = zoo_mean_delay.compute(workers = ['localhost:39661', 'localhost:34049'])
## output
# distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
# distributed.nanny - WARNING - Restarting worker
# distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
# distributed.nanny - WARNING - Restarting worker
# distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
# distributed.nanny - WARNING - Restarting worker
# distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
# distributed.nanny - WARNING - Restarting worker
# 
# KeyboardInterrupt
# 
# distributed.nanny - WARNING - Restarting worker

notes

  • 我尝试过client.scatter(t_zoo),但没有帮助。
  • 调用client.compute(zoo_mean_delay)而不是zoo_mean_delay.compute()没有帮助。
python python-3.x dask python-xarray dask-distributed
1个回答
0
投票

启动了两个工作程序,每个工作程序获得350 MB的RAM

但是,由于超过95%的内存被数据填充(332.5 MB),工作人员崩溃了

这是不足以有效运行Numpy / Pandas / Xarray堆栈的RAM。仅运行Python并导入这些库会占用大量内存。我不会尝试在2GB的RAM中运行任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.