使用Dask和Xarray的两个数据集之间的差异
我需要用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
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
作为起点重现你的问题吗?