r-是否有一种方法可以最大限度地减少唯一组合的数量



正在尝试请求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个请求(

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

限制是根据字段的数量设置的,可以将其视为grib意义上的"记录"数量。通常建议的方法是在检索命令中保留变量列表和较短的时间尺度,然后在数年内循环(较长的时间(。不过,对于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并行化,尽管我从未尝试过,但我想这不会有太大帮助,因为每个用户的作业限制设置得很低,所以你最终会在那里的队列中有大量作业。。。

相关内容

最新更新