从 THREDDS/OPeNDap 服务器切片和下载数百个 NetCDF 文件的最快方法

Fastest way to slice and download hundreds of NetCDF files from THREDDS/OPeNDap server

我正在处理 NASA-NEX-GDPP CMIP6 数据。我目前有单独打开和切片每个文件的工作代码,但是为所有模型输出和场景下载一个变量需要几天时间。我的目标是获得所有模型输出和场景的所有温度和降水数据,然后应用气候指标并与 xclim 集成。

url = 'https://ds.nccs.nasa.gov/thredds2/dodsC/AMES/NEX/GDDP-CMIP6/UKESM1-0-LL/ssp585/r1i1p1f2/tasmax/tasmax_day_UKESM1-0-LL_ssp585_r1i1p1f2_gn_2098.nc'
lat = 53
lon = 0

try:
    with xr.open_dataset(url) as ds:
        ds.interp(lat=lat,lon=lon).to_netcdf(url.split('/')[-1])
except Exception as e: print(e)

此代码有效但速度非常慢(一个变量、一个位置需要几天)。想知道是否有更好、更快的方法?我不想下载整个文件,因为它们每个都是 240 MB!

更新:

我还尝试了以下方法来利用 dask 并行任务,它稍微快一些,但仍然需要几天的时间才能完成完整的变量输出:

 def interp_one_url(path,lat,lon):
       with xr.open_dataset(path) as ds: 
           ds = ds.interp(lat=lat,lon=lon)
           return ds 
urls = ['https://ds.nccs.nasa.gov/thredds2/dodsC/AMES/NEX/GDDP-CMIP6/UKESM1-0-LL/ssp585/r1i1p1f2/tasmax/tasmax_day_UKESM1-0-LL_ssp585_r1i1p1f2_gn_2100.nc',
        'https://ds.nccs.nasa.gov/thredds2/dodsC/AMES/NEX/GDDP-CMIP6/UKESM1-0-LL/ssp585/r1i1p1f2/tasmax/tasmax_day_UKESM1-0-LL_ssp585_r1i1p1f2_gn_2099.nc']
lat = 53
lon = 0
paths = [url.split('/')[-1] for url in urls]
datasets = [interp_one_url(url,lat,lon) for url in urls]
xr.save_mfdataset(datasets, paths=paths)

一种方法是通过 ncss 门户下载,而不是通过 NASA 提供的 OpenDAP 下载。 URL 不同,但它也是迭代的。

例如

lat = 53
lon = 0
   
URL = "https://ds.nccs.nasa.gov/thredds/ncss/AMES/NEX/GDDP-CMIP6/ACCESS-CM2/historical/r1i1p1f1/pr/pr_day_ACCESS-CM2_historical_r1i1p1f1_gn_2014.nc?var=pr&north={}&west={}&east={}&south={}&disableProjSubset=on&horizStride=1&time_start=2014-01-01T12%3A00%3A00Z&time_end=2014-12-31T12%3A00%3A00Z&timeStride=1&addLatLon=true"

wget.download(URL.format(lat,lon,lon+1,lat-1) #north, west, east, south boundary

这样切片下载一步完成。一旦你有了 URL,你可以使用 wget 之类的东西,并行完成下载,这比一次选择和保存一个要快