当使用来自netcdf文件的dask.array时,使用scheduler =“processes”变量不是可选错误

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

我正在尝试使用dask来处理三维数组(x,y,time)。这些数组存储为netcdf4文件,并使用netCDF4 python库编写。我能够从我的netcdf文件中定义的变量创建一个dask.array,当我尝试使用scheduler =“processes”计算结果时,会引发以下错误:

NotImplementedError: Variable is not picklable

我知道parallel writing is not supported when using dask with netcdf,但是在沿着时间轴的平均值的简单计算期间引发了错误。 This post似乎相关,但无助于解决我的问题。计算沿时间轴的平均值仅用于演示目的。在实践中,我将应用更复杂的函数,这些函数仅部分基于numpy,这就是为什么我想通过使用dask中的进程来回避Python的全局解释器锁。

import dask.array as da
import netCDF4

path = 'path/to/netcdf_file'
dset = netCDF4.Dataset(path, 'r')
var = dset['var']

x = da.from_array(var, chunks=(500, 500, 2))
dset.close()

result = da.mean(x, axis=2)

# raises NotImplementedError: Variable is not picklable
result.compute(scheduler="processes")

# works just fine
result.compute(scheduler="threads")

为什么.compute(scheduler="processes")会引发错误以及可能的解决方案是什么?由于我有很多netcdf4格式的文件,我想避免将所有内容转换为其他文件格式。

我在CentOS 7上运行Python 2.7(miniconda发行版)。已经从conda-forge安装了Dask v1.1.4和netCDF4 v1.4.3.2。

python dask netcdf
1个回答
1
投票

当使用Dask的多处理调度程序(例如scheduler="processes")时,进程将需要单独处理打开和访问netCDF数据。我强烈建议尝试使用Xarray来完成这项任务,因为它已经内置了对使用netCDF和Dask的支持。我已经使用下面的Xarray / Dask / netCDF4写出了一个等效的工作流程:

import dask
import xarray as xr

ds = xr.open_dataset('path/to/netcdf_file',
                     engine='netcdf4',
                     chunks={'x': 500, 'y': 500, 'z': 2})

with dask.config.set(scheduler='processes'):
    result = ds['var'].mean(dim='z').load()

Xarray's documentation有一个很好的页面讨论如何在这种情况下使用dask。

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