李永生, 張金標, 張 敏, 陳冰懷
(廣東省氣象探測數(shù)據(jù)中心, 廣州 510080)
GRIB 碼是世界氣象組織(WMO)推薦使用的與計算機操作系統(tǒng)無關(guān)的壓縮的二進制編碼, 是一種用于交換和存儲規(guī)則分布數(shù)據(jù)的二進制文件格式, 現(xiàn)行的GRIB 碼版本有GRIB1和GRIB2兩種格式, 具有多維數(shù)據(jù)存儲方便、壓縮比高、支持多種壓縮方式、擴展性強等特點, 尤其擅長大容量多維度的非結(jié)構(gòu)化數(shù)據(jù)的交換, 廣泛應(yīng)用于數(shù)值天氣預(yù)報產(chǎn)品、海洋水文等數(shù)據(jù)的存儲和交換. 針對GRIB碼進行解碼工具有兩種, 第一種是wgrib命令行工具, 可以通過命令行的方式通過不同的參數(shù)組合對GRIB數(shù)據(jù)進行讀取操作.第2種方法是利用業(yè)界Unidata發(fā)布的NetCDF-java的網(wǎng)格數(shù)據(jù)操作API (支持Bufr、Grib、NetCDF3/4、HDF等網(wǎng)格數(shù)據(jù)), 具有按照Shape形狀提取指定范圍內(nèi)網(wǎng)格數(shù)據(jù)的方法, 可以通過編程使用get和set鍵值操作讀取數(shù)據(jù), 其中第一種方法在國內(nèi)應(yīng)用比較廣泛.使用上述方法基本能夠滿足獲取特定維度的部分數(shù)據(jù)的業(yè)務(wù)應(yīng)用需求[1], 但在面向決策分析領(lǐng)域氣象預(yù)測的應(yīng)用中, 通常以融合分析應(yīng)用為主, 需要對海量的數(shù)值預(yù)報產(chǎn)品的一次性批量數(shù)據(jù)快速讀取和分析, 傳統(tǒng)的數(shù)據(jù)讀物方法存在數(shù)據(jù)讀取時間效率不高, 空間資源消耗大等問題[2]. 本文即針對上述業(yè)務(wù)痛點, 面向氣象預(yù)警、預(yù)報和預(yù)測業(yè)務(wù)實際需求, 以GRIB碼存儲的數(shù)值預(yù)報數(shù)據(jù)產(chǎn)品為研究對象, 設(shè)計一種基于精準定位, 數(shù)據(jù)提取的維度、讀取經(jīng)緯度的范圍可按需定制的, 多進程處理的快速數(shù)據(jù)提取方法.
本文的研究對象是以GRIB格式存儲的半結(jié)構(gòu)化氣象數(shù)值預(yù)報產(chǎn)品, 現(xiàn)行的GRIB 碼版本有GRIB1和GRIB2兩種格式, 每個 GRIB1記錄單元通常存儲某個要素在某個層次的連續(xù)網(wǎng)格序列點的數(shù)據(jù)值. 邏輯上將記錄單元劃分為“段”, 每個GRIB1記錄單元可以包含六段, 其中兩個段是可選的, 具體如表1所示.
表1 GRIB1格式說明
GRIB文件每一個“段”對應(yīng)到數(shù)值預(yù)報產(chǎn)品中就是一個平面數(shù)據(jù), 該平面數(shù)據(jù)是一個非結(jié)構(gòu)化的網(wǎng)格數(shù)據(jù), 網(wǎng)格點數(shù)由產(chǎn)品的空間分辨率決定, 平面數(shù)據(jù)Data[v]由產(chǎn)品的要素種類(VarName)、產(chǎn)品的生成時間(DataTime)、層次高度(LevelName)、預(yù)報時效(ForcastName)、成員變量(MemberName)等維度信息唯一確定, 用數(shù)學(xué)表達為:
上述維度信息確定的平面數(shù)據(jù)D ata[v]是網(wǎng)格點類的半結(jié)構(gòu)化數(shù)據(jù), 其屬性信息包括經(jīng)度范圍、緯度范圍、空間分辨率以及數(shù)據(jù)維度上的南北走向, 1代表維度上從南到北依次排列, 0表示維度從北到南依次排列, 其屬性函數(shù)可以描述為:
分析傳統(tǒng)數(shù)據(jù)讀取算法的技術(shù)原理可知, 數(shù)據(jù)解碼效率方面存在主要制約因素[3]是需要一定范圍內(nèi)遍歷查找所需提取特定維度數(shù)據(jù)所在的位置, 即數(shù)據(jù)塊的定位[4]; 這在一次性批量處理大量數(shù)值預(yù)報產(chǎn)品時產(chǎn)生了一定的時間損耗; 但上述因素存在較大的提升空間, 相關(guān)的方法的創(chuàng)新研究也基本圍繞上述制約因素展開. 針對上述問題, 本文基于精準數(shù)據(jù)定位獲取數(shù)據(jù)的算法[5], 節(jié)省了傳統(tǒng)方法中數(shù)據(jù)塊查找所消耗的時間;進而明顯提高了數(shù)據(jù)的讀取速度, 算法具體流程如下.
(2)可根據(jù)數(shù)值預(yù)報產(chǎn)品的要素種類、產(chǎn)品的生成時間、層次高度、預(yù)報時效等信息, 定制篩選業(yè)務(wù)所需的平面數(shù)據(jù)[11,12].
該品種由福建省泉州市農(nóng)業(yè)科學(xué)研究所(福建省泉州市晉江市池店鎮(zhèn)泉安北路,郵編:362212)和云南省農(nóng)業(yè)科學(xué)院經(jīng)濟作物研究所培育。
圖1 數(shù)據(jù)文件結(jié)構(gòu)圖
算法根據(jù)實際業(yè)務(wù)確定的空間經(jīng)緯度范圍信息,對數(shù)值預(yù)報產(chǎn)品平面數(shù)據(jù)進行逐行剪裁, 形成業(yè)務(wù)所需空間范圍的平面數(shù)據(jù), 數(shù)據(jù)截取從低緯度到高維的方向具體的算法流程如下.
計算讀取圈數(shù):
(2)再確定讀取圈數(shù):
獲取特定數(shù)據(jù)塊的精確位置后, 為了不產(chǎn)生計算和存儲資源的浪費以及處理時間的增加. 需要對一定空間范圍的數(shù)據(jù)進行按需截取, 避免總是進行整個平面數(shù)據(jù)的讀取和流轉(zhuǎn)處理, 從而可以按照業(yè)務(wù)需求, 根據(jù)其屬性函數(shù)在空間范圍內(nèi)進行裁剪以獲取業(yè)務(wù)所需空間范圍的數(shù)據(jù), 這樣可以減少數(shù)據(jù)的傳輸量, 提高數(shù)據(jù)業(yè)務(wù)應(yīng)用效率[6-9].
染料的廣泛使用導(dǎo)致染料廢水造成的環(huán)境污染日益嚴重[1,2]。染料廢水污染組分復(fù)雜、毒性強,是一種難處理的工業(yè)廢水[3,4]。亞甲基藍就是一種使用最為廣泛的染料。常用的染料廢水的處理方法主要有沉淀法[5]、氧化法[6]、膜分離法[7]及吸附法[8]等。吸附法因其易操作、高效等優(yōu)點而受到重視。
老太醫(yī)娓娓道來:火藥量適中即可,專門灼燒對手最柔弱之處,比如說兩腋、男根、肚臍和喉囊。劇痛之下,腎火陡升,傷者會心跳驟停,引發(fā)猝死。此外,為了增加火勢,也為了掩蓋火藥味,掩人耳目,表象應(yīng)以大火焚燒為主。這也不難辦到:以奇特的香料摻入燃油之中,作為助燃之物。以火藥來點燃油料,燒起來迅猛異常,根本無法撲救。
運用擬人手法編出這一段菊花與主人公的對話,這是菊花對主人公的提問,因為菊花不能從大地吸收養(yǎng)分而衰弱下去,這是表現(xiàn)菊花對大地的渴望。這話也是主人公即作者中野重治的自白。被帶到監(jiān)獄里來,被和人民大眾隔離,監(jiān)獄的生活又很艱苦,可以理解為作者也不能從大地吸收養(yǎng)分的比喻。巧妙地借菊花的口把這話說出來表達自己的思念勞苦大眾的內(nèi)心。
根據(jù)數(shù)值預(yù)報產(chǎn)品原始空間經(jīng)度范圍信息確定,整個經(jīng)度范圍:
每個GRIB實體文件是若干平面數(shù)據(jù) D ata[v]的組合, 每個平面數(shù)據(jù)對應(yīng)一個數(shù)據(jù)塊, 文件結(jié)構(gòu)示意如圖1所示.
(1)獲取元信息體: 獲取整個GRIB文件的所有數(shù)據(jù)塊的元信息, 包括每個“數(shù)據(jù)塊”的起始位置, 結(jié)束位置等, 所獲取的信息均是輕量的元信息, 形成元信息體.整個過程的耗時在毫秒級別.
(1)每圈讀取長度的確定
(1)可對平面數(shù)據(jù)進行空間范圍內(nèi)的按需裁剪, 允許業(yè)務(wù)用戶根據(jù)所需數(shù)據(jù)的空間經(jīng)緯度信息對數(shù)據(jù)塊進行按需截取[10].
整體經(jīng)度差:
在與梁兆賢的近距離交談中,我們感受到了印刷業(yè)以及市場對于人才技術(shù)和創(chuàng)新的迫切需要,以及具備學(xué)習(xí)能力的重要性。在他看來,要通過人才隊伍的建設(shè),提高企業(yè)管理水平,使印刷行業(yè)加快轉(zhuǎn)型升級,推動中國制造2025在印刷領(lǐng)域的前進。
計算單圈讀取的數(shù)據(jù)長度:
(3)目標數(shù)據(jù)塊的位置: 根據(jù)元數(shù)據(jù)體和實體數(shù)據(jù)體的對應(yīng)關(guān)系, 首先對元數(shù)據(jù)體進行整理, 通過數(shù)據(jù)整理函數(shù), 將元數(shù)據(jù)信息進行分類, 重點確定數(shù)據(jù)塊的實際位置, 位置確定后, 根據(jù)屬性信息計算數(shù)據(jù)的偏移量進而定位數(shù)據(jù)并對數(shù)據(jù)塊進行循環(huán)讀取.
整個緯度范圍:
煤炭資源是非常寶貴的不可再生資源。由于煤炭的不可再生性和重要性,對煤炭資源的開采和保護廣受社會的關(guān)注。在煤炭綜采工作面上進行系統(tǒng)的開發(fā)和創(chuàng)新,是當前研究的熱點。例如工作面支架液壓系統(tǒng)的管控,需分析支架液壓系統(tǒng)發(fā)生污染的情況,找到有效改善措施來控制污染,避免影響到綜采工作面支架液壓系統(tǒng)的安全運行。
整體緯度差:
(2)獲取實體信息體: 算法過濾去掉每個數(shù)據(jù)塊的元數(shù)據(jù)信息, 并一次性將所有GRIB數(shù)據(jù)解碼為二進制數(shù)據(jù), 包括數(shù)據(jù)的解壓縮、解碼, 一次性將所有GRIB數(shù)據(jù)解碼為二進制數(shù)據(jù), 稱為實體數(shù)據(jù)體. 實體數(shù)據(jù)體存儲的順序和步驟(1)中元數(shù)據(jù)的順序是一一對應(yīng)的.
Number=4×(R2-L2)/LatiInterval
采用for循環(huán)依次讀取每圈數(shù)據(jù):
應(yīng)用SPSS 17.0統(tǒng)計軟件對數(shù)據(jù)進行統(tǒng)計分析。計量資料以均數(shù)±標準差(±s)表示,組間比較采用重復(fù)測量的方差分析,P<0.05為差異有統(tǒng)計學(xué)意義。
算法的實現(xiàn)過程如算法1.
算法1. 格點數(shù)據(jù)按需截取算法輸入: 模型 model包括分辨率值, 原始經(jīng)緯度范圍, 裁剪經(jīng)緯度范圍:{[(longitudeInterval, latitudeInterval)], [(orignalLongitudeStart,orignalLatitudeStart), (orignalLongitudeEnd, orignalLatitudeEnd)],[(cutLongitudeStart, orignalLatitudeStart), (orignalLongitudeEnd,orignalLatitudeEnd)]}輸出: 字節(jié)數(shù)組data 1. 計算經(jīng)緯度范圍2. double longitudeRange=|orignalLongitudeStart-orignalLongitudeEnd|+longitudeInterval 3. double latitudeRange=|orignalLatitudeStart-orignalLatitudeEnd|+latitudeInterval 4. 計算經(jīng)度差值double longitudeSub1=|orignalLongitudeStart-cutLongitudeStart|double longitudeSub2=|orignalLongitudeEnd-cutLongitudeEnd|5. 計算緯度差值double latitudeSub1=|orignalLatitudeStart-cutLatitudeStart|double latitudeSub2=|orignalLatitudeEnd-cutLatitudeEnd|6. 計算整體的經(jīng)度差值和緯度差值double longitudeFinal=longitudeSub1+longitudeSub2 double latitudeFinal=latitudeSub1+latitudeSub2 7. 確定數(shù)據(jù)存儲方向, 1表示從南到北, 0表示從北到南String sNDirection = model.getGridInfoXml().getsNDirection();String wEDirection = model.getGridInfoXml().getwEDirection();
8. 根據(jù)纏繞方向確定緯度裁剪大小double latitudeSub = 0d;switch (sNDirection) do case “1”:latitudeSub = latitudeSub2;break;case “0”:latitudeSub = latitudeSub1;break;default:decodeLogger.error (“---------數(shù)據(jù)南北纏繞方向定義錯誤, 只能為1或者0!”);break;}end switch 9. 根據(jù)纏繞方向確定經(jīng)度裁剪大小double longitudeSub = 0d;switch (wEDirection) do case “1”:longitudeSub = longitudeSub1;break;case “0”:longitudeSub = longitudeSub2;break;default:decodeLogger.error(“---------數(shù)據(jù)東西纏繞方向定義錯誤,只能為1或者0!”);break;}End switch 10. 計算緯度遍歷個數(shù)int latiLengthValue = (int)((latitudeRange-latitudeFinal)/latitudeInterval);11. 計算緯線長度double latiLength = latitudeSub/latitudeInterval;12. 計算緯度取值長度double longitudePosi = 4 × (longitudeRange/longitudeInterval) ×latiLength;13. 計算沿經(jīng)度緯度移動值int latitudePosi = 4 × (int)(longitudeSub/longitudeInterval);14. 計算開始整體移動的個數(shù)long finalPosi = (long)(planeStartPos + longitudePosi + latitudePosi);15. 計算單圈讀取長度double length = 4 × (longitudeRange-longitudeFinal)/longitudeInterval;16. 輸出data for int i = 0; i < latiLengthValue; i++ do byte[] oneCircleByte = gribUtil.readFileByPosiBytes(bodyPath,finalPosi, (int) length);data = byteJoin(data, oneCircleByte);finalPosi += 4 × longitudeRange/longitudeInterval;}end for 17. return data
本文選取一類數(shù)值預(yù)報產(chǎn)品進行實際測試, 該產(chǎn)品每時次需處理的數(shù)據(jù)文件為66個, 每個文件數(shù)據(jù)量約600 M, 每個文件約200個平面數(shù)據(jù). 以數(shù)據(jù)解碼耗時為主要考核指標, 分別對不同的文件數(shù)均采用單個進程解碼測試. 結(jié)果表明隨著文件數(shù)量的增長耗時基本呈線性增長趨勢, 如圖2所示, 且66個文件的總耗時由傳統(tǒng)方法的2 h提高到約40 min, 解碼效率大幅提升.
圖2 單進程多文件解碼耗時統(tǒng)計圖
另外以單平面耗時為主要考核指標, 分別采用1進程, 4進程、8進程以及16進程進行數(shù)據(jù)處理, 實際測試結(jié)果表明, 采用16進程處理的速度由單個進程的257 ms提高到37 ms. 實際測試結(jié)果顯示多進程技術(shù)的引入對數(shù)據(jù)處理速度提升明顯. 如圖3所示.
圖3 多進程單平面解碼耗時統(tǒng)計圖
本文實現(xiàn)的批量數(shù)據(jù)數(shù)據(jù)處理方法已經(jīng)為廣東省氣象行業(yè)的市縣版的Gift系統(tǒng)提供數(shù)據(jù)快速處理服務(wù), 同時在廣東省氣象行業(yè)的預(yù)報預(yù)測和決策分析業(yè)務(wù)系統(tǒng)提供可視化數(shù)據(jù)服務(wù)支撐, 如圖4所示.
圖4 預(yù)報決策可視化業(yè)務(wù)化數(shù)據(jù)支撐圖
本文針對傳統(tǒng)數(shù)據(jù)抽取方法效率不高的問題, 基于多進程處理技術(shù), 設(shè)計了一種基于精準位置尋址的快速數(shù)據(jù)塊定位算法, 實現(xiàn)了數(shù)據(jù)塊的精準定位; 設(shè)計了可按需在空間范圍內(nèi)進行裁剪的截取算法, 可按需根據(jù)數(shù)據(jù)的屬性維度、經(jīng)緯度范圍等信息實現(xiàn)數(shù)據(jù)按需抽取; 基于上述算法實現(xiàn)了全流程統(tǒng)一控制的多進程數(shù)據(jù)讀取的業(yè)務(wù)流程. 實際測試結(jié)果表明利用本方法來解碼GRIB格式的數(shù)值預(yù)報產(chǎn)品, 可以大大提升非結(jié)構(gòu)氣象數(shù)值預(yù)報產(chǎn)品數(shù)據(jù)的抽取效率, 提高資源利用率. 為海量半結(jié)構(gòu)化的氣象數(shù)值預(yù)報數(shù)據(jù)產(chǎn)品的快速處理提供了方法參考, 具有很好的業(yè)務(wù)應(yīng)用價值.