使用Dask和Xarray的两个数据集之间的差异

使用Dask和Xarray的两个数据集之间的差异,dask,python-xarray,dask-distributed,Dask,Python Xarray,Dask Distributed,我需要用Dask和Xarray计算两个数据集之间的差异(两个每日变量每月重新采样)。这是我的代码: def diff(path_1,path_2): import xarray as xr max_v=xr.open_mfdataset(path_1, combine='by_coords', concat_dim="time", parallel=True)['variable_1'].resample({'time': '1M'}).max() m

我需要用Dask和Xarray计算两个数据集之间的差异(两个每日变量每月重新采样)。这是我的代码:

def diff(path_1,path_2):
    import xarray as xr
    max_v=xr.open_mfdataset(path_1, combine='by_coords', concat_dim="time", parallel=True)['variable_1'].resample({'time': '1M'}).max()
    min_v=xr.open_mfdataset(path_2, combine='by_coords', concat_dim="time", parallel=True)['variable_2'].resample({'time': '1M'}).min()
    
    return (max_v-min_v).compute()
        
future = client.submit(diff,path_1,path_2)
diff = client.gather(future)
我也试过:

%%time
def max_var(path):
    import xarray as xr
    multi_file_dataset = xr.open_mfdataset(path, combine='by_coords', concat_dim="time", parallel=True)
    max_v=multi_file_dataset['variable_1'].resample(time='1M').max(dim='time')
    return max_v.compute()

def min_var(path):
    import xarray as xr
    multi_file_dataset = xr.open_mfdataset(path, combine='by_coords', concat_dim="time", parallel=True)
    min_v=multi_file_dataset['variable_2'].resample(time='1M').min(dim='time')
    return min_v.compute()

futures=[]
future = client.submit(max_temp,path1)
futures.append(future)
future = client.submit(min_temp,path2)
futures.append(future)
results = client.gather(futures)

diff = results[0]-results[1]
但是我注意到,在getitem nanmax e getitem nanmin(例如1980年的1974年)的最后一步中,计算变得非常慢

此处显示群集配置:

cluster = SLURMCluster(walltime='1:00:00',cores=5,memory='5GB')
cluster.scale(jobs=10)
每个数据集由几个文件组成:总大小=7GB

有没有更好的方法来实现这种计算


谢谢

我不能100%确定这对您的案例有效,但是如果没有
mwe
就很难做得更好。因此,我怀疑
xarray
使用的
.compute()
可能与
客户机.submit
冲突,因为现在计算正在工作者身上进行,我不确定它是否能在同级之间正确分配工作(但这是一个怀疑,我不确定)。因此,一种解决方法是将计算输出到主脚本中(因为
xarray
将在后台与
dask
集成),因此这可能会起作用:

将xarray作为xr导入
max_v=xr.open_mfdataset(path_1,combine='by_coords',concat_dim='time',parallel=True,chunks={'time':10})['variable_1']
min_v=xr.open_mfdataset(path_2,combine='by_coords',concat_dim='time',parallel=True,chunks={'time':10})['variable_2']
diff_result=(max_v-min_v).compute()
以下是不同数据集上的
mwe

将xarray作为xr导入
#chunks选项将创建dask数组
ds=xr.tutorial.open_数据集('rasm',decode_times=True,chunks={'time':10})
#这些都是懒惰的计算
max_v=ds['Tair'].重新采样({'time':'1M'}).max()
min_v=ds['Tair'].重新采样({'time':'1M'}).min()
#这将在后台使用dask调度程序
diff_result=(max_v-min_v).compute()
#由于数据引用同一个变量,因此所有结果将为0或“nan”(如果该变量在该时间/x/y组合中不可用)

小点,但对于变量和函数使用同一个名称不是一个好主意,所以在第一个代码段中,考虑区分<代码>差异/代码> var /函数。@ SultRayZaBayv感谢您的建议。除此之外,您认为实现还可以吗?我尝试了第一个代码段(因为我有两个不同的变量),但它似乎工作不正常……您添加了
chunks
选项了吗?您看到的错误是什么?是的,我添加了该选项。计算占用了太多的时间,事实上,我在监控UIHmm中没有看到任何计算,我没有在代码段中添加它,但是您必须启动集群。是你干的吗?没有
mwe
就很难调试问题。你能用我的
mwe
作为起点重现你的问题吗?