Python xarray 使用open_mfdataset打开多个带有xarray/dask的netcdf的最有效方法(在我的例子中异常缓慢)

Python xarray 使用open_mfdataset打开多个带有xarray/dask的netcdf的最有效方法(在我的例子中异常缓慢),python-xarray,Python Xarray,我有一个363个netcdf文件的目录,对应不同的时间(所有文件都有类似的内部结构,“时间”维度为1),每个270MB,总共大约100GB。我想在一个xarray中上传所有这些数据(使用dask数组和块)。似乎open_mfdataset是合适的解决方案,但我似乎没有正确地使用它,因为它非常慢 # Import modules

我有一个363个netcdf文件的目录,对应不同的时间(所有文件都有类似的内部结构,“时间”维度为1),每个270MB,总共大约100GB。我想在一个xarray中上传所有这些数据(使用dask数组和块)。似乎open_mfdataset是合适的解决方案,但我似乎没有正确地使用它,因为它非常慢

# Import modules                                                                                                                                             
import time
import numpy as np
import xarray as xr
from dask.distributed import Client

client = Client() 

# Define variables of interest                                                                                                                               
vars = ['nitrogendioxide_tropospheric_column_qafiltered']

# Read data                                                                                                                                                  
start = time.time()
dir = '/data_directory/'
ds = xr.open_mfdataset('{}/*2019*.nc'.format(dir), engine='netcdf4', combine='nested', concat_dim='time', parallel=True)
ds.close()
print(' | size(ds)/duration = {:0.2f}GB / {:0.2f}s'.format(ds.nbytes / 1e9,time.time()-start))
执行此操作所需的时间为:
size(ds)/duration=98.83GB/1746.73s
。为什么这么慢

请注意,如果我没有将
client=client()
parallel=True
放在一起,它不会显著改变时间,因此我有点困惑

注意:此测试在HPC设施中的交互式会话上执行:

>>> client  
<Client: 'tcp://127.0.0.1:43651' processes=4 threads=4, memory=33.78 GB>
>>客户端
NBbis:获得的X射线为:

>>> ds
<xarray.Dataset>
Dimensions:                                                    (corner: 4, time: 363, x: 1028, x_b: 1029, y: 649, y_b: 650)
Coordinates:
    lat                                                        (y, x) float64 dask.array<chunksize=(649, 1028), meta=np.ndarray>
    lon                                                        (y, x) float64 dask.array<chunksize=(649, 1028), meta=np.ndarray>
  * time                                                       (time) datetime64[ns] 2019-01-01T05:00:00 ... 2019-12-31T05:00:00
Dimensions without coordinates: corner, x, x_b, y, y_b
Data variables:
    nitrogendioxide_tropospheric_column                        (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    nitrogendioxide_tropospheric_column_precision              (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    qa_value                                                   (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    latitude_bounds                                            (time, corner, y, x) float64 dask.array<chunksize=(1, 4, 649, 1028), meta=np.ndarray>
    longitude_bounds                                           (time, corner, y, x) float64 dask.array<chunksize=(1, 4, 649, 1028), meta=np.ndarray>
    solar_zenith_angle                                         (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    solar_azimuth_angle                                        (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    viewing_zenith_angle                                       (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    viewing_azimuth_angle                                      (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    cloud_fraction_crb                                         (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    surface_altitude                                           (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    surface_albedo                                             (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    surface_classification                                     (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    surface_pressure                                           (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    cloud_radiance_fraction_nitrogendioxide_window             (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    nitrogendioxide_stratospheric_column                       (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    nitrogendioxide_stratospheric_column_precision             (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    degrees_of_freedom                                         (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    one                                                        (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    latitude_bounds_qafiltered                                 (time, corner, y, x) float64 dask.array<chunksize=(1, 4, 649, 1028), meta=np.ndarray>
    longitude_bounds_qafiltered                                (time, corner, y, x) float64 dask.array<chunksize=(1, 4, 649, 1028), meta=np.ndarray>
    nitrogendioxide_tropospheric_column_qafiltered             (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    nitrogendioxide_tropospheric_column_precision_qafiltered   (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    qa_value_qafiltered                                        (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    cloud_radiance_fraction_nitrogendioxide_window_qafiltered  (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    cloud_fraction_crb_qafiltered                              (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    surface_altitude_qafiltered                                (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    surface_albedo_qafiltered                                  (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    surface_classification_qafiltered                          (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    surface_pressure_qafiltered                                (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    solar_zenith_angle_qafiltered                              (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    solar_azimuth_angle_qafiltered                             (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    viewing_zenith_angle_qafiltered                            (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    viewing_azimuth_angle_qafiltered                           (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    nitrogendioxide_stratospheric_column_qafiltered            (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    nitrogendioxide_stratospheric_column_precision_qafiltered  (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    degrees_of_freedom_qafiltered                              (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
    lat_b                                                      (time, y_b, x_b) float64 dask.array<chunksize=(1, 650, 1029), meta=np.ndarray>
    lon_b                                                      (time, y_b, x_b) float64 dask.array<chunksize=(1, 650, 1029), meta=np.ndarray>
Attributes:
    regrid_method:  conservative
    history:        read PRODUCT group...
>>ds
尺寸:(转角:4,时间:363,x:1028,x_b:1029,y:649,y_b:650)
协调:
横向(y,x)浮动64 dask.array
lon(y,x)浮点数64 dask.array
*时间日期时间64[ns]2019-01-01T05:00:00。。。2019-12-31T05:00:00
不带坐标的尺寸:角,x,x_b,y,y_b
数据变量:
氮氧化物对流层柱(时间,y,x)浮动64 dask.阵列
氮氧化物对流层柱精度(时间,y,x)浮动64 dask阵列
qa_值(时间,y,x)float64 dask.array
纬度界(时间、角点、y、x)浮动64 dask.array
经度界(时间、角点、y、x)浮动64 dask.array
太阳天顶角(时间,y,x)浮动64 dask阵列
太阳方位角(时间,y,x)浮动64 dask阵列
查看天顶角(时间,y,x)浮动64 dask.array
查看64 dask阵列的方位角(时间、y、x)
云分数crb(时间,y,x)浮点64 dask.array
地面高度(时间,y,x)浮动64 dask.array
地表反照率(时间,y,x)浮动64 dask.array
表面分类(时间,y,x)浮点64 dask.array
表面压力(时间,y,x)浮动64 dask.array
云辐射率分数氮氧化物窗口(时间,y,x)浮动64 dask.array
氮氧化物平流层柱(时间,y,x)漂浮64 dask.阵列
氮氧化物\u平流层\u柱\u精度(时间,y,x)浮动64 dask.阵列
自由度(时间,y,x)浮动64 dask.array
一个(时间,y,x)浮点64 dask.array
纬度边界过滤(时间、角点、y、x)浮点64 dask.array
经度_边界_qaftered(时间、角点、y、x)float64 dask.array
氮氧化物对流层柱(时间,y,x)漂浮64 dask阵列
氮氧化物\对流层\列\精度\滤波(时间,y,x)浮动64 dask阵列
qa_值_qafiltered(时间,y,x)float64 dask.array
云辐射率分数氮氧化物窗口滤波(时间,y,x)浮动64 dask.array
cloud_fraction_crb_qaftered(时间,y,x)float64 dask.array
表面高度(时间,y,x)浮动64 dask.array
地表反照率(时间,y,x)浮动64 dask.array
表面分类过滤(时间,y,x)浮点64 dask.array
表面压力(时间,y,x)浮动64 dask.array
太阳天顶角(时间,y,x)浮动64 dask阵列
太阳方位角滤波(时间,y,x)浮动64 dask阵列
查看天顶角(时间,y,x)浮点64 dask.array
查看方位角滤波(时间,y,x)浮点64 dask.array
氮氧化物平流层柱过滤(时间,y,x)漂浮64 dask.array
氮氧化物\平流层\柱\精度\过滤(时间,y,x)浮动64 dask.阵列
自由度(时间,y,x)浮点64 dask.array
lat_b(时间,y_b,x_b)浮点64 dask.array
lon_b(时间,y_b,x_b)浮点64 dask.array
属性:
再研磨法:保守
历史:阅读产品组。。。
我查看了其他帖子,但没有找到这个问题的答案。 感谢您的帮助。

看到这一点-似乎有很多人对open_mfdataset的性能有问题,目前没有明显的解决方案。

看到这一点-似乎有很多人对open_mfdataset的性能有问题,目前没有明显的解决方案