APP下载

一种提升数值预报产品生成效率的多进程算法

2022-12-27杨玉红李永生尹天翔

广东气象 2022年6期
关键词:解码复杂度进程

杨玉红,李永生,尹天翔

(广东省气象探测数据中心,广东 广州 510640)

近年来,随着大数据等信息技术的飞速发展,各行各业信息化建设呈现出日新月异的发展景象,气象行业更是如此[1-2]。信息化带来海量数据,既是一种机遇,也是一种挑战[3-4]。一方面,实时数据时空分辨率精细化导致数据量剧增;另一方面应用对数据的时效性和完整性要求更高。如何完成海量数据的高速处理,是应用面临的巨大挑战[5-6]。

数值预报产品作为“大数据”的典型,其处理方法和处理速度一直是众人关注的焦点[7]。近年来,随着空间分辨率越来越高、预报时间间隔越来越短,高精度集合预报产品越来越广泛被业务应用,因其巨大的数据量与时效性要求,对实时处理技术提出近乎严苛的要求,处理效率直接影响产品能否在业务中被使用。本研究对南海台风集合预报产品的并行算法进行研究,引入了python多进程处理模块,探究多进程处理在数值预报领域的作用效果。

1 传统串行数据预报产品解码算法

数值预报文件的存储格式有很多种,比如二进制格式、文本格式、GRIB1格式、GRIB2格式[8]、NETCDF格式[9-10]等。为了便于管理与应用,广东省气象探测数据中心建立了“广东省气象格点资料服务平台”,服务内容之一就是将多途径收集的各种数值预报资料统一加工,生成便于存储和访问的“自有”NETCDF格式产品库。该产品库数据组织形式统一、产品周期统一,给后期无论是接口服务,还是绘图服务都提供了极大的便利。

但是,随着高精度集合预报产品的出现,服务平台原有的解码效率又成为业务关注的焦点。以广州热带海洋气象研究所研发的南海台风集合预报产品为例,其特点是分辨率高、格点数多、集合成员数目多、数据量庞大;与欧洲集合预报产品相比,南海台风集合预报产品的GRIB数据量增加了5倍,转换为NetCDF格式后,数据量更是增加至10倍以上(表1)。

表1 南海台风集合预报产品与欧洲集合预报产品参数对比

1.1 基于简短目录的数值预报解码方法

基于简短目录的数值预报产品解码方法,是搭建气象格点资料服务平台以来的一种能有效提高生成产品效率的方法[11]。

简短目录是GRIB文件的头信息,记录了GRIB文件的记录编号、二进制位置、时间、参数名称、层次值等信息。

算法原理:先将所有GRIB文件全部转换为二进制文件,同时输出该文件的简短目录列表;然后将简短目录列表根据要素名称进行分类后得到新的简短目录列表;最后,对新简短目录列表进行遍历,根据新简短目录列表要素位置信息定位二进制数据文件,将不同要素的数据写入不同的NetCDF文件中。

基于简短目录的数值预报产品解码方法特点,将数值预报产品不同要素进行分类的阶段使用了简短目录进行操作,而不是直接操作原始数据,操作数据量大大减少,节省了解码时间。

1.2 算法复杂度

由于GRIB与NetCDF是两种不同的编码,必须遍历一次所有的数据并重组,因此从“渐近时间复杂性”的角度无法对算法进行优化。

与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作:S(n)=O(f(n)),一般所讨论的是除正常占用内存开销外的辅助存储单元规模。简短目录列表解码方法中,每次只需读取DataUnit大小数据,因此,S(n)=DataUnit。

由于该算法读写频繁,因此IO对算法的影响不可忽视:

其中,DecodeData为转换后二进制文件;GribFile表示原始GRIB文件;VarType为按要素分类后的新简短目录列表;DataUnit为经度乘以纬度范围的格点场数据量。

1.3 数值预报算法的复杂度

根据算法复杂度公式,将欧洲集合预报产品的各个参数代入式(1)(R代表读操作、W代表写操作,将表1中各参数代入1.2节式(1)):

高空要素:S(n)=(181×111×4 Byte)=78.48 K

地面要素:S(n)=(281×161×4 Byte)=176.72 K

IO(n)=63×(R+R+W+W)+63×51×(7×11+21)R=315 000R+126W

将南海台风集合预报产品的各个参数代入公式:

S(n)=981×587×4 Byte=2.20 M

IO(n)=3 630×(R+R+W+W)+3 630×31×(6×5+10)R=4 508 460R+7 260W

由表2可以看出,南海台风集合预报产品,无论是在空间复杂度还是IO复杂度,较欧洲集合预报产品,都增加了至少10倍,IO写操作甚至增加至60倍。欧洲集合预报产品从接收第一份GRIB数据文件开始,至所有文件转换为NetCDF格式完毕,处理时间总计不超过40 min,解码速度和效率完全能够满足业务使用需求;而南海台风集合预报产品,在使用简短目录列表方法后,测试得到的运行时间约为3.5 h,是欧洲集合预报处理时间的5倍多。因此,需探求一种新的高效解码方法来解决高精度数值预报产品解码效率的问题。

表2 两个数值产品基于简短目录列表算法复杂度分析结果

2 并行集合预报解码算法

通过简短目录列表解码方法在解码高精度集合预报产品时,由于无论是空间复杂度还是IO复杂度,都是普通数值预报产品的数十倍。经测试,解码一个时次南海台风集合预报产品的所有要素,时间约为3.5 h。测试环境如表3所示。

表3 测试环境服务器参数

南海台风集合预报产品的GRIB源文件生成时间为t+8 h至t+10 h,若加上解码时间3.5 h,那么NetCDF预报产品的生成时间将在t+11.5 h至13.5 h,超出了业务时间容忍度,如无法在早间会商时使用等。因此,探求一种高效的解码方式,将高精度集合预报产品融入到当前业务中显得尤为重要。

2.1 多进程处理

由于广东省气象局使用的数值预报产品对不同的要素是单独处理、单独存放,按照要素名生成对应的NetCDF文件。鉴于要素相互独立,各要素间不存在前置处理或其他依存关系,多进程处理不会出现数据死锁、共享资源锁等影响处理速度的情况,因此可以考虑采用多进程处理方法来提高解码效率,降低程序运行时间。

然而,多进程处理方法需要考虑服务器内存是否足够、IO读写能力是否足够,进程数必须按照服务器的计算能力来调整,需要通过空间复杂度和IO复杂度的计算来确定适合的最大进程数。S(n)和IO(n)会随着N个进程发生线性增长,变成N·S(n)和N·IO(n),进程总数会受到限制。

2.2 多进程设计在南海台风集合预报产品的应用

考虑到南海台风集合预报产品包含16个要素,根据解码程序的设计流程,解码算法在生成NetCDF要素产品时,每个要素单独处理,文件独立存放,最终生成16个NetCDF文件。图1左侧部分为解码算法的输入产品,即3 630个GRIB文件产品;右侧部分为算法的输出产品,即16个NetCDF要素产品。中间部分为解码程序,以及由解码程序生成的3个子进程。

“广东省气象格点资料服务平台”的调度程序是基于Python语言开发的,因此选择使用Multiprocessing包的Pool模块来完成并行调度算法无疑是一种最合适的方法。

Multiprocessing包是Python中的多进程管理包,是跨平台的多进程模块,能够像管理线程一样管理进程。Pool模块来自于Multiprocessing包,可以提供指定数量的进程供用户调用,当有新的请求提交到Pool时,如果Pool池还没有满,就会创建一个新的进程来执行请求。如果Pool池满,请求就会告知等待,直到Pool池中有进程结束,才会创建新的进程来执行这些请求。

算法方案伪代码如下:

#定义【父进程】数值预报解码算法(算法参数为要素名称)

#定义算法参数列表

#使用多进程方式调用算法

综合分析可知,原算法父进程需要串行逐个处理与生成16个要素,如今使用并行解码算法后,父进程根据进程池设置子进程个数,创建子进程,然后由N个子进程并行完成16个要素的处理与生成工作,解码时间将缩短为串行解码方式的1/N,这将会大大提高了解码效率。

并行算法的效率跟算法的并行进程数密不可分,一定程度上,进程数量越多,算法的效率越高。但在并行高精度集合预报产品解码算法中,由于算法需要使用空间换时间,为了更好的利用CPU资源,因此占用的内存资源数量非常高,进程数受到服务器资源总数的限制。

计算最大进程数:首先,计算每时次每个要素在读取过程中需要分配的内存空间,计算方法:占用内存空间=经纬度格点数×层次数×预报时效数×成员数×4字节(FLOAT类型)

通过计算,得出每时次每个要素需要占用内存空间约为40 Gb,而“广东省气象格点资料服务平台”中转换服务器的内存数目为128 Gb,因此,每次转换过程中,最多启动3个转换进程,保证系统资源能够承载服务正常运行。

根据上述结论,测试南海台风集合预报产品解码程序子进程数量1至数量4时,程序运行时间与系统内存使用情况。得到结论见表4。

表4 南海台风集合预报产品解码程序运行时间与系统资源使用情况

同样,计算得出欧洲集合预报产品每时次每个要素需要占用内存空间为14 Gb。因此,每次转换过程中,最多启动9个转换进程,以保证服务器能够正常运行。测试欧洲集合预报产品解码程序子进程数量为1至9时,程序运行时间与系统内存使用情况,所得结果如表5所示。

表5 欧洲集合预报产品解码程序运行时间与系统资源使用情况

3 结论

本研究提出了一种多进程数值预报产品解码算法,旨在提高高精度数值预报产品等数据量较大的数值预报产品的处理效率。本算法结合数值预报简短目录解码方法,利用数值预报产品解码过程中各要素之前彼此隔离的特点,依据计算机架构的局部性原理引入多进程计算方法,通过空间换时间,以达到提高数值预报解码效率的目的。经过实验测试,得到以下结论:

1)使用多进程计算在高精度集合预报产品解码过程中确实可以提高解码效率。

2)在内存容量和硬盘容量允许的前提下,并行子进程数目越多,计算效率越高,算法运行所需要的时间越少。

3)确保系统资源足够的前提下,设定子进程数据尽可能大,会提高算法运行效率。

4)在保证计算机运算速度和方便实现多进程调度时,选择Python或Go这类面向对象编程的多范式的计算机语言,可以最大限度将业务计算和任务调度解耦。

本研究的测试结果表明,基于Python的多进程数值预报产品解码算法是可行的,而且将会大大提高程序的效能,为未来数值预报产品等大数据在业务中的应用提供了一种新的思路。

猜你喜欢

解码复杂度进程
《解码万吨站》
解码eUCP2.0
债券市场对外开放的进程与展望
改革开放进程中的国际收支统计
一种低复杂度的惯性/GNSS矢量深组合方法
NAD C368解码/放大器一体机
Quad(国都)Vena解码/放大器一体机
求图上广探树的时间复杂度
某雷达导51 头中心控制软件圈复杂度分析与改进
出口技术复杂度研究回顾与评述