楊玉紅,李永生,尹天翔
(廣東省氣象探測(cè)數(shù)據(jù)中心,廣東 廣州 510640)
近年來,隨著大數(shù)據(jù)等信息技術(shù)的飛速發(fā)展,各行各業(yè)信息化建設(shè)呈現(xiàn)出日新月異的發(fā)展景象,氣象行業(yè)更是如此[1-2]。信息化帶來海量數(shù)據(jù),既是一種機(jī)遇,也是一種挑戰(zhàn)[3-4]。一方面,實(shí)時(shí)數(shù)據(jù)時(shí)空分辨率精細(xì)化導(dǎo)致數(shù)據(jù)量劇增;另一方面應(yīng)用對(duì)數(shù)據(jù)的時(shí)效性和完整性要求更高。如何完成海量數(shù)據(jù)的高速處理,是應(yīng)用面臨的巨大挑戰(zhàn)[5-6]。
數(shù)值預(yù)報(bào)產(chǎn)品作為“大數(shù)據(jù)”的典型,其處理方法和處理速度一直是眾人關(guān)注的焦點(diǎn)[7]。近年來,隨著空間分辨率越來越高、預(yù)報(bào)時(shí)間間隔越來越短,高精度集合預(yù)報(bào)產(chǎn)品越來越廣泛被業(yè)務(wù)應(yīng)用,因其巨大的數(shù)據(jù)量與時(shí)效性要求,對(duì)實(shí)時(shí)處理技術(shù)提出近乎嚴(yán)苛的要求,處理效率直接影響產(chǎn)品能否在業(yè)務(wù)中被使用。本研究對(duì)南海臺(tái)風(fēng)集合預(yù)報(bào)產(chǎn)品的并行算法進(jìn)行研究,引入了python多進(jìn)程處理模塊,探究多進(jìn)程處理在數(shù)值預(yù)報(bào)領(lǐng)域的作用效果。
數(shù)值預(yù)報(bào)文件的存儲(chǔ)格式有很多種,比如二進(jìn)制格式、文本格式、GRIB1格式、GRIB2格式[8]、NETCDF格式[9-10]等。為了便于管理與應(yīng)用,廣東省氣象探測(cè)數(shù)據(jù)中心建立了“廣東省氣象格點(diǎn)資料服務(wù)平臺(tái)”,服務(wù)內(nèi)容之一就是將多途徑收集的各種數(shù)值預(yù)報(bào)資料統(tǒng)一加工,生成便于存儲(chǔ)和訪問的“自有”NETCDF格式產(chǎn)品庫(kù)。該產(chǎn)品庫(kù)數(shù)據(jù)組織形式統(tǒng)一、產(chǎn)品周期統(tǒng)一,給后期無論是接口服務(wù),還是繪圖服務(wù)都提供了極大的便利。
但是,隨著高精度集合預(yù)報(bào)產(chǎn)品的出現(xiàn),服務(wù)平臺(tái)原有的解碼效率又成為業(yè)務(wù)關(guān)注的焦點(diǎn)。以廣州熱帶海洋氣象研究所研發(fā)的南海臺(tái)風(fēng)集合預(yù)報(bào)產(chǎn)品為例,其特點(diǎn)是分辨率高、格點(diǎn)數(shù)多、集合成員數(shù)目多、數(shù)據(jù)量龐大;與歐洲集合預(yù)報(bào)產(chǎn)品相比,南海臺(tái)風(fēng)集合預(yù)報(bào)產(chǎn)品的GRIB數(shù)據(jù)量增加了5倍,轉(zhuǎn)換為NetCDF格式后,數(shù)據(jù)量更是增加至10倍以上(表1)。
表1 南海臺(tái)風(fēng)集合預(yù)報(bào)產(chǎn)品與歐洲集合預(yù)報(bào)產(chǎn)品參數(shù)對(duì)比
基于簡(jiǎn)短目錄的數(shù)值預(yù)報(bào)產(chǎn)品解碼方法,是搭建氣象格點(diǎn)資料服務(wù)平臺(tái)以來的一種能有效提高生成產(chǎn)品效率的方法[11]。
簡(jiǎn)短目錄是GRIB文件的頭信息,記錄了GRIB文件的記錄編號(hào)、二進(jìn)制位置、時(shí)間、參數(shù)名稱、層次值等信息。
算法原理:先將所有GRIB文件全部轉(zhuǎn)換為二進(jìn)制文件,同時(shí)輸出該文件的簡(jiǎn)短目錄列表;然后將簡(jiǎn)短目錄列表根據(jù)要素名稱進(jìn)行分類后得到新的簡(jiǎn)短目錄列表;最后,對(duì)新簡(jiǎn)短目錄列表進(jìn)行遍歷,根據(jù)新簡(jiǎn)短目錄列表要素位置信息定位二進(jìn)制數(shù)據(jù)文件,將不同要素的數(shù)據(jù)寫入不同的NetCDF文件中。
基于簡(jiǎn)短目錄的數(shù)值預(yù)報(bào)產(chǎn)品解碼方法特點(diǎn),將數(shù)值預(yù)報(bào)產(chǎn)品不同要素進(jìn)行分類的階段使用了簡(jiǎn)短目錄進(jìn)行操作,而不是直接操作原始數(shù)據(jù),操作數(shù)據(jù)量大大減少,節(jié)省了解碼時(shí)間。
由于GRIB與NetCDF是兩種不同的編碼,必須遍歷一次所有的數(shù)據(jù)并重組,因此從“漸近時(shí)間復(fù)雜性”的角度無法對(duì)算法進(jìn)行優(yōu)化。
與時(shí)間復(fù)雜度類似,空間復(fù)雜度是指算法在計(jì)算機(jī)內(nèi)執(zhí)行時(shí)所需存儲(chǔ)空間的度量。記作:S(n)=O(f(n)),一般所討論的是除正常占用內(nèi)存開銷外的輔助存儲(chǔ)單元規(guī)模。簡(jiǎn)短目錄列表解碼方法中,每次只需讀取DataUnit大小數(shù)據(jù),因此,S(n)=DataUnit。
由于該算法讀寫頻繁,因此IO對(duì)算法的影響不可忽視:
其中,DecodeData為轉(zhuǎn)換后二進(jìn)制文件;GribFile表示原始GRIB文件;VarType為按要素分類后的新簡(jiǎn)短目錄列表;DataUnit為經(jīng)度乘以緯度范圍的格點(diǎn)場(chǎng)數(shù)據(jù)量。
根據(jù)算法復(fù)雜度公式,將歐洲集合預(yù)報(bào)產(chǎn)品的各個(gè)參數(shù)代入式(1)(R代表讀操作、W代表寫操作,將表1中各參數(shù)代入1.2節(jié)式(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
將南海臺(tái)風(fēng)集合預(yù)報(bào)產(chǎn)品的各個(gè)參數(shù)代入公式:
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可以看出,南海臺(tái)風(fēng)集合預(yù)報(bào)產(chǎn)品,無論是在空間復(fù)雜度還是IO復(fù)雜度,較歐洲集合預(yù)報(bào)產(chǎn)品,都增加了至少10倍,IO寫操作甚至增加至60倍。歐洲集合預(yù)報(bào)產(chǎn)品從接收第一份GRIB數(shù)據(jù)文件開始,至所有文件轉(zhuǎn)換為NetCDF格式完畢,處理時(shí)間總計(jì)不超過40 min,解碼速度和效率完全能夠滿足業(yè)務(wù)使用需求;而南海臺(tái)風(fēng)集合預(yù)報(bào)產(chǎn)品,在使用簡(jiǎn)短目錄列表方法后,測(cè)試得到的運(yùn)行時(shí)間約為3.5 h,是歐洲集合預(yù)報(bào)處理時(shí)間的5倍多。因此,需探求一種新的高效解碼方法來解決高精度數(shù)值預(yù)報(bào)產(chǎn)品解碼效率的問題。
表2 兩個(gè)數(shù)值產(chǎn)品基于簡(jiǎn)短目錄列表算法復(fù)雜度分析結(jié)果
通過簡(jiǎn)短目錄列表解碼方法在解碼高精度集合預(yù)報(bào)產(chǎn)品時(shí),由于無論是空間復(fù)雜度還是IO復(fù)雜度,都是普通數(shù)值預(yù)報(bào)產(chǎn)品的數(shù)十倍。經(jīng)測(cè)試,解碼一個(gè)時(shí)次南海臺(tái)風(fēng)集合預(yù)報(bào)產(chǎn)品的所有要素,時(shí)間約為3.5 h。測(cè)試環(huán)境如表3所示。
表3 測(cè)試環(huán)境服務(wù)器參數(shù)
南海臺(tái)風(fēng)集合預(yù)報(bào)產(chǎn)品的GRIB源文件生成時(shí)間為t+8 h至t+10 h,若加上解碼時(shí)間3.5 h,那么NetCDF預(yù)報(bào)產(chǎn)品的生成時(shí)間將在t+11.5 h至13.5 h,超出了業(yè)務(wù)時(shí)間容忍度,如無法在早間會(huì)商時(shí)使用等。因此,探求一種高效的解碼方式,將高精度集合預(yù)報(bào)產(chǎn)品融入到當(dāng)前業(yè)務(wù)中顯得尤為重要。
由于廣東省氣象局使用的數(shù)值預(yù)報(bào)產(chǎn)品對(duì)不同的要素是單獨(dú)處理、單獨(dú)存放,按照要素名生成對(duì)應(yīng)的NetCDF文件。鑒于要素相互獨(dú)立,各要素間不存在前置處理或其他依存關(guān)系,多進(jìn)程處理不會(huì)出現(xiàn)數(shù)據(jù)死鎖、共享資源鎖等影響處理速度的情況,因此可以考慮采用多進(jìn)程處理方法來提高解碼效率,降低程序運(yùn)行時(shí)間。
然而,多進(jìn)程處理方法需要考慮服務(wù)器內(nèi)存是否足夠、IO讀寫能力是否足夠,進(jìn)程數(shù)必須按照服務(wù)器的計(jì)算能力來調(diào)整,需要通過空間復(fù)雜度和IO復(fù)雜度的計(jì)算來確定適合的最大進(jìn)程數(shù)。S(n)和IO(n)會(huì)隨著N個(gè)進(jìn)程發(fā)生線性增長(zhǎng),變成N·S(n)和N·IO(n),進(jìn)程總數(shù)會(huì)受到限制。
考慮到南海臺(tái)風(fēng)集合預(yù)報(bào)產(chǎn)品包含16個(gè)要素,根據(jù)解碼程序的設(shè)計(jì)流程,解碼算法在生成NetCDF要素產(chǎn)品時(shí),每個(gè)要素單獨(dú)處理,文件獨(dú)立存放,最終生成16個(gè)NetCDF文件。圖1左側(cè)部分為解碼算法的輸入產(chǎn)品,即3 630個(gè)GRIB文件產(chǎn)品;右側(cè)部分為算法的輸出產(chǎn)品,即16個(gè)NetCDF要素產(chǎn)品。中間部分為解碼程序,以及由解碼程序生成的3個(gè)子進(jìn)程。
“廣東省氣象格點(diǎn)資料服務(wù)平臺(tái)”的調(diào)度程序是基于Python語(yǔ)言開發(fā)的,因此選擇使用Multiprocessing包的Pool模塊來完成并行調(diào)度算法無疑是一種最合適的方法。
Multiprocessing包是Python中的多進(jìn)程管理包,是跨平臺(tái)的多進(jìn)程模塊,能夠像管理線程一樣管理進(jìn)程。Pool模塊來自于Multiprocessing包,可以提供指定數(shù)量的進(jìn)程供用戶調(diào)用,當(dāng)有新的請(qǐng)求提交到Pool時(shí),如果Pool池還沒有滿,就會(huì)創(chuàng)建一個(gè)新的進(jìn)程來執(zhí)行請(qǐng)求。如果Pool池滿,請(qǐng)求就會(huì)告知等待,直到Pool池中有進(jìn)程結(jié)束,才會(huì)創(chuàng)建新的進(jìn)程來執(zhí)行這些請(qǐng)求。
算法方案?jìng)未a如下:
#定義【父進(jìn)程】數(shù)值預(yù)報(bào)解碼算法(算法參數(shù)為要素名稱)
#定義算法參數(shù)列表
#使用多進(jìn)程方式調(diào)用算法
綜合分析可知,原算法父進(jìn)程需要串行逐個(gè)處理與生成16個(gè)要素,如今使用并行解碼算法后,父進(jìn)程根據(jù)進(jìn)程池設(shè)置子進(jìn)程個(gè)數(shù),創(chuàng)建子進(jìn)程,然后由N個(gè)子進(jìn)程并行完成16個(gè)要素的處理與生成工作,解碼時(shí)間將縮短為串行解碼方式的1/N,這將會(huì)大大提高了解碼效率。
并行算法的效率跟算法的并行進(jìn)程數(shù)密不可分,一定程度上,進(jìn)程數(shù)量越多,算法的效率越高。但在并行高精度集合預(yù)報(bào)產(chǎn)品解碼算法中,由于算法需要使用空間換時(shí)間,為了更好的利用CPU資源,因此占用的內(nèi)存資源數(shù)量非常高,進(jìn)程數(shù)受到服務(wù)器資源總數(shù)的限制。
計(jì)算最大進(jìn)程數(shù):首先,計(jì)算每時(shí)次每個(gè)要素在讀取過程中需要分配的內(nèi)存空間,計(jì)算方法:占用內(nèi)存空間=經(jīng)緯度格點(diǎn)數(shù)×層次數(shù)×預(yù)報(bào)時(shí)效數(shù)×成員數(shù)×4字節(jié)(FLOAT類型)
通過計(jì)算,得出每時(shí)次每個(gè)要素需要占用內(nèi)存空間約為40 Gb,而“廣東省氣象格點(diǎn)資料服務(wù)平臺(tái)”中轉(zhuǎn)換服務(wù)器的內(nèi)存數(shù)目為128 Gb,因此,每次轉(zhuǎn)換過程中,最多啟動(dòng)3個(gè)轉(zhuǎn)換進(jìn)程,保證系統(tǒng)資源能夠承載服務(wù)正常運(yùn)行。
根據(jù)上述結(jié)論,測(cè)試南海臺(tái)風(fēng)集合預(yù)報(bào)產(chǎn)品解碼程序子進(jìn)程數(shù)量1至數(shù)量4時(shí),程序運(yùn)行時(shí)間與系統(tǒng)內(nèi)存使用情況。得到結(jié)論見表4。
表4 南海臺(tái)風(fēng)集合預(yù)報(bào)產(chǎn)品解碼程序運(yùn)行時(shí)間與系統(tǒng)資源使用情況
同樣,計(jì)算得出歐洲集合預(yù)報(bào)產(chǎn)品每時(shí)次每個(gè)要素需要占用內(nèi)存空間為14 Gb。因此,每次轉(zhuǎn)換過程中,最多啟動(dòng)9個(gè)轉(zhuǎn)換進(jìn)程,以保證服務(wù)器能夠正常運(yùn)行。測(cè)試歐洲集合預(yù)報(bào)產(chǎn)品解碼程序子進(jìn)程數(shù)量為1至9時(shí),程序運(yùn)行時(shí)間與系統(tǒng)內(nèi)存使用情況,所得結(jié)果如表5所示。
表5 歐洲集合預(yù)報(bào)產(chǎn)品解碼程序運(yùn)行時(shí)間與系統(tǒng)資源使用情況
本研究提出了一種多進(jìn)程數(shù)值預(yù)報(bào)產(chǎn)品解碼算法,旨在提高高精度數(shù)值預(yù)報(bào)產(chǎn)品等數(shù)據(jù)量較大的數(shù)值預(yù)報(bào)產(chǎn)品的處理效率。本算法結(jié)合數(shù)值預(yù)報(bào)簡(jiǎn)短目錄解碼方法,利用數(shù)值預(yù)報(bào)產(chǎn)品解碼過程中各要素之前彼此隔離的特點(diǎn),依據(jù)計(jì)算機(jī)架構(gòu)的局部性原理引入多進(jìn)程計(jì)算方法,通過空間換時(shí)間,以達(dá)到提高數(shù)值預(yù)報(bào)解碼效率的目的。經(jīng)過實(shí)驗(yàn)測(cè)試,得到以下結(jié)論:
1)使用多進(jìn)程計(jì)算在高精度集合預(yù)報(bào)產(chǎn)品解碼過程中確實(shí)可以提高解碼效率。
2)在內(nèi)存容量和硬盤容量允許的前提下,并行子進(jìn)程數(shù)目越多,計(jì)算效率越高,算法運(yùn)行所需要的時(shí)間越少。
3)確保系統(tǒng)資源足夠的前提下,設(shè)定子進(jìn)程數(shù)據(jù)盡可能大,會(huì)提高算法運(yùn)行效率。
4)在保證計(jì)算機(jī)運(yùn)算速度和方便實(shí)現(xiàn)多進(jìn)程調(diào)度時(shí),選擇Python或Go這類面向?qū)ο缶幊痰亩喾妒降挠?jì)算機(jī)語(yǔ)言,可以最大限度將業(yè)務(wù)計(jì)算和任務(wù)調(diào)度解耦。
本研究的測(cè)試結(jié)果表明,基于Python的多進(jìn)程數(shù)值預(yù)報(bào)產(chǎn)品解碼算法是可行的,而且將會(huì)大大提高程序的效能,為未來數(shù)值預(yù)報(bào)產(chǎn)品等大數(shù)據(jù)在業(yè)務(wù)中的應(yīng)用提供了一種新的思路。