Есть ли способ минимизировать количество уникальных комбинаций?

Пытаюсь запросить данные 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 ответ

Ограничение задается количеством полей, которое можно рассматривать как количество "записей" в смысле гриба. Обычно предлагаемый подход заключается в том, чтобы оставить список переменных и более короткие временные рамки в команде извлечения, а затем выполнить цикл по годам (более длительное время). Однако для 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, хотя я никогда не пробовал, я предполагаю, что это не слишком поможет, поскольку существует ограничение на количество заданий для каждого пользователя, которое установлено довольно низко, поэтому вы просто получите большое число вакансий в очереди есть...

Другие вопросы по тегам