Dask 如何使xarray.interp()并行工作?
我在一个大型3D数据阵列(气象数据:纬度、经度、时间)上使用Dask 如何使xarray.interp()并行工作?,dask,python-xarray,Dask,Python Xarray,我在一个大型3D数据阵列(气象数据:纬度、经度、时间)上使用xarray.interp,根据离散映射函数f将值(风速)映射到新值。 插值方法似乎只使用一个核进行计算,这使得该过程效率低下。我不知道如何使xarray使用多个内核来完成此任务 我确实通过htop和dask仪表板为xarray.interp监控了计算。 htop仅显示要使用的一个核心,仪表板不显示任何工人的任何活动。我能观察到的唯一dask活动是从磁盘加载netcdf数据文件。如果使用.load()预加载数据,则此dask活动将消失
xarray.interp
,根据离散映射函数f
将值(风速)映射到新值。
插值方法似乎只使用一个核进行计算,这使得该过程效率低下。我不知道如何使xarray
使用多个内核来完成此任务
我确实通过htop
和dask
仪表板为xarray.interp
监控了计算。
htop
仅显示要使用的一个核心,仪表板不显示任何工人的任何活动。我能观察到的唯一dask
活动是从磁盘加载netcdf
数据文件。如果使用.load()
预加载数据,则此dask
活动将消失
我还尝试将scipy.interpolate.interp1d
函数与xarray.apply_ufunc()
一起使用,以达到我想要的效果,但也没有观察到任何并行使用(htop
)或活动(dask
仪表板)
目前对我来说,最快的方法是使用numpy.interp
,然后使用原始DataArray的坐标将其重新编译回xr.DataArray
。但这也不是平行的,只是快了百分之几
在下面的MWE中,在块4中的da.load()
语句之后,我没有看到任何dask
活动
编辑:当使用例如
htop
进行评估时,代码必须在单独的块1-4中运行。由于load()
会导致多核活动,并且会显式(块2)或隐式(由4触发)发生,因此如果将脚本作为一个整体运行,则很容易将多核活动错误地归因于.interp()
#1:用于dask仪表板
从dask.distributed导入客户端
client=client()
显示(客户端)
将xarray作为xr导入
将numpy作为np导入
da=xr.tutorial.open_数据集(“空气温度”,chunks={})[air']
#2:将数据预加载到内存中
da.load()
#3:虚拟插值函数
xp=np.linspace(0400,21)
fp=-1*(xp-300)**2
xr_interp_da=xr.DataArray(fp,[('xp',xp)],name='interpolation function')
#4:我希望它能并行运行,但事实并非如此
f=xr_interp_da.interp({'xp':da})
我运行了那段代码,我的机器的所有核心都有活动,有没有da.load()
语句。您是在每个注释之间单独运行语句,还是始终作为一个整体运行@JulianGiles?我没有明确提到这一点(相应地更新了问题)。如果脚本作为一个整体运行,则.load()
也会隐式发生,并在我的内核上引发活动。在最后一个代码块(第4个)中,我没有看到多个核心上的活动,我希望有更多的核心参与。我在单独的块中运行代码,并且作为一个整体运行代码,没有.load()
语句,我得到了多核活动。并非所有核心都是100%连续活动,但在观看htop
时,我肯定看到几个核心同时工作。