@@ -2895,15 +2895,27 @@ def _validate_interp_indexer(x, new_x):
2895
2895
obj , newidx = missing ._localize (obj , {k : v })
2896
2896
validated_indexers [k ] = newidx [k ]
2897
2897
2898
+ # optimization: create dask coordinate arrays once per Dataset
2899
+ # rather than once per Variable when dask.array.unify_chunks is called later
2900
+ # GH4739
2901
+ if obj .__dask_graph__ ():
2902
+ dask_indexers = {
2903
+ k : (index .to_base_variable ().chunk (), dest .to_base_variable ().chunk ())
2904
+ for k , (index , dest ) in validated_indexers .items ()
2905
+ }
2906
+
2898
2907
variables : Dict [Hashable , Variable ] = {}
2899
2908
for name , var in obj ._variables .items ():
2900
2909
if name in indexers :
2901
2910
continue
2902
2911
2912
+ if is_duck_dask_array (var .data ):
2913
+ use_indexers = dask_indexers
2914
+ else :
2915
+ use_indexers = validated_indexers
2916
+
2903
2917
if var .dtype .kind in "uifc" :
2904
- var_indexers = {
2905
- k : v for k , v in validated_indexers .items () if k in var .dims
2906
- }
2918
+ var_indexers = {k : v for k , v in use_indexers .items () if k in var .dims }
2907
2919
variables [name ] = missing .interp (var , var_indexers , method , ** kwargs )
2908
2920
elif all (d not in indexers for d in var .dims ):
2909
2921
# keep unrelated object array
0 commit comments