Есть ли способ минимизировать количество уникальных комбинаций? - PullRequest
0 голосов
/ 03 марта 2020

Попытка запросить данные 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, ... и уникальные () значение каждого столбца, чтобы получить годы и переменную для запроса. Но такой подход иногда приводит к слишком большому размеру запроса: req.list <- list(year = c("2013", "2014", ..."2018"), variable = c("a", "b")) отклоняется, поскольку length (год) * length (переменная) = 12> 11.

Также я использую foreach () и doParallel для создания нескольких запросов (не более 15 запросов одновременно)

Если у кого-то есть лучшее решение, поделитесь им (минимизируйте количество уникальных комбинаций, соблюдая ограничение размера запроса), большое спасибо.

1 Ответ

0 голосов
/ 04 марта 2020

Предел устанавливается в терминах количества полей, которые можно рассматривать как количество «записей» в смысле «grib». Обычно предлагаемый подход состоит в том, чтобы оставить список переменных и более короткие временные шкалы в команде поиска, а затем l oop в течение нескольких лет (более длительное время). Это вопрос выбора, хотя для 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, хотя я никогда не пробовал, я ' Я полагаю, что это не очень поможет, так как для каждого пользователя установлен лимит заданий, который достаточно низок, так что вы просто получите большое количество заданий в очереди ...

...