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