有没有一种方法可以减少唯一组合的数量?

时间:2020-03-03 07:48:59

标签: r matrix query-optimization era5

尝试请求ERA5数据。该请求受大小限制,系统将自动拒绝任何大于限制的请求。但是,由于每个请求都需要几个小时才能由气候数据存储(CDS)处理,因此希望尽可能接近请求限制。

例如,我有一个向量years <- seq(from = 1981, to = 2019, by = 1)和一个向量variables <- c("a", "b", "c", "d", "e"...., "z")。最大请求大小为11。这意味着长度(年)*长度(变量)必须小于或等于11。

对于每个请求,我必须提供一个包含年份和变量的字符向量的列表。例如: req.list <- list(year = c("1981", "1982", ..."1991"), variable = c("a"))可行,因为有11年和1个变量。

我考虑过使用expand.grid(),然后使用第1-11行,第12-22行,...和unique()对每列进行赋值以获取请求的年份和变量。但是这种方法有时会导致请求大小过大: req.list <- list(year = c("2013", "2014", ..."2018"), variable = c("a", "b"))被拒绝,因为长度(年)*长度(变量)= 12> 11。

我也正在使用foreach()和doParallel创建多个请求(一次最多15个请求)

如果有人有更好的解决方案,请分享(在遵守请求大小限制的同时,减少唯一组合的数量),非常感谢。

1 个答案:

答案 0 :(得分:0)

该限制是根据字段数设置的,从字段意义上讲,可以将其视为“记录”的数量。通常,建议的方法是在检索命令中保留变量列表和较短的时标,然后循环使用这些年(较长的时间)。尽管对于ERA5,这是一个选择问题,因为数据全部存储在缓存中,而不是在磁带驱动器上,对于基于磁带驱动器的请求,重要的是使用单个请求来检索同一磁带上的数据(即,如果使用CDS来检索季节性预报或非ERA5的其他数据集。

这是一个简单的循环示例:

import cdsapi

c = cdsapi.Client()

yearlist=[str(s) for s in range(1979,2019)]

for year in yearlist:
    c.retrieve(
    'reanalysis-era5-single-levels',
    {
        'product_type': 'reanalysis',
        'format': 'netcdf',
        'variable': [
            '10m_u_component_of_wind', '10m_v_component_of_wind', '2m_dewpoint_temperature',
            '2m_temperature',
        ],
        'year': year,
        'month': [
            '01', '02', '03',
            '04', '05', '06',
            '07', '08', '09',
            '10', '11', '12',
        ],
        'day': [
            '01', '02', '03',
            '04', '05', '06',
            '07', '08', '09',
            '10', '11', '12',
            '13', '14', '15',
            '16', '17', '18',
            '19', '20', '21',
            '22', '23', '24',
            '25', '26', '27',
            '28', '29', '30',
            '31',
        ],
        'time': [
            '00:00', '01:00', '02:00',
            '03:00', '04:00', '05:00',
            '06:00', '07:00', '08:00',
            '09:00', '10:00', '11:00',
            '12:00', '13:00', '14:00',
            '15:00', '16:00', '17:00',
            '18:00', '19:00', '20:00',
            '21:00', '22:00', '23:00',
        ],
    },
    'data'+year+'.nc')

我想您可以将它与foreach并行化,尽管我从未尝试过,我想它没有太大帮助,因为每个用户的工作限制设置得很低,所以最终您会得到那里的队列中有大量作业...