張 華,李細生
(湖南省株洲市氣象局,湖南 株洲 412003)
Micaps4[1]是目前我國大部分氣象臺站制作天氣預(yù)報的操作平臺,功能眾多,需海量的數(shù)據(jù)資料支持,國家氣象局將這些數(shù)據(jù)以不同格式(大部分是文本格式)下發(fā),優(yōu)點是便于直接讀取和訪問,缺點是空間占用非常大,每天大約有100 G,且訪問效率較低。現(xiàn)在各個省局都建有分布式數(shù)據(jù)中心,市、縣兩級再無需維護數(shù)據(jù)服務(wù)器,訪問速度和效率較以前大幅度提升,但仍然沒有解決基層臺站歷史資料的長期不間斷保存問題,這些海量的歷史數(shù)據(jù)其實也是氣象部門的寶貴資源和財富,白白流失實在浪費?;诖?,可設(shè)計一個資料存儲程序,通過一些必要的刪減和壓縮手段,將每天的資料打包到一個數(shù)據(jù)文件,既大大節(jié)約存儲空間,又便于資料的交流和使用以及日后的分析應(yīng)用,從而打好氣象部門的“大數(shù)據(jù)”[2]這張牌。
為了達到數(shù)據(jù)文件大幅度瘦身的目標(biāo),保存資料時必須有相應(yīng)的刪減和壓縮技巧,可通過如下幾種方式縮減容量:
Micaps資料一般有全球范圍,東亞范圍等,基層臺站如果研究的區(qū)域不需要那么大,則可將范圍適當(dāng)縮小。如中央臺下發(fā)的EC細網(wǎng)格資料范圍是73°~135°E、18°~54°N,總共有497×289=143 633個網(wǎng)格點,網(wǎng)格距是0.125個經(jīng)緯度。假如研究目標(biāo)區(qū)域僅僅為江南、華南等地,那么可以將經(jīng)緯度范圍裁取為:100°~130°E、20°~40°N,如此一來,網(wǎng)格點變?yōu)?61×161=25 921個,數(shù)據(jù)量變?yōu)樵瓉淼?/6。
Micaps資料里占用空間較大的有衛(wèi)星數(shù)據(jù)產(chǎn)品、雷達產(chǎn)品、數(shù)值模式產(chǎn)品等,如果去除這些,或者只選擇少數(shù)幾個精品進行保持,也可減少一半以上存儲容量。
Micaps后臺使用的數(shù)據(jù)很多為文本格式,它是一種典型的順序文件,其文件的邏輯結(jié)構(gòu)又屬于流式文件??梢栽赨nix、Macintosh、Microsoft Windows、DOS和其它操作系統(tǒng)之間自由交互,文本文件編碼基于字符定長,譯碼容易但占用空間較大;二進制文件編碼是變長的,所以它靈活,存儲利用率高,占用空間較小。因此,可以利用二進制文件占用空間小的優(yōu)點,通過程序?qū)⑽谋疚募械臄?shù)據(jù)按一定的順序?qū)懭攵M制DAT文件,從而縮減容量。當(dāng)然,二進制文件也有可讀性差的缺點,所以數(shù)據(jù)保存好以后一定要用專門的說明文件對數(shù)據(jù)的格式和順序進行單獨說明,并與數(shù)據(jù)文件存放在同一路徑下。
下面以ECMWF_THIN某個時次的低溫預(yù)報數(shù)據(jù)為例來說明改寫程序的編寫。編程語言為VB.NET,源程序用Microsoft Visual Studio 2010編譯[3]通過,代碼的功能是將某一時間點EC細網(wǎng)格2 m最低氣溫預(yù)報(間隔6 h、共38個預(yù)報時次)通過范圍裁取后寫入二進制DAT文件,設(shè)計思路是將原文本數(shù)據(jù)文件去除文件頭,選取適當(dāng)范圍數(shù)據(jù)再改變順序?qū)懭攵M制文件*.dat。源代碼如下:
Public Function DuECTmn(ByVal Parth As String)
…
Dim Jd(2), Jdt(2) As Single '原經(jīng)度范圍,細網(wǎng)格73 Dim Wd(2), Wdt(2) As Single '原緯度范圍,細網(wǎng)格18 Dim T1(17), Tm1(38) As Integer Dim T2(17), Tm2(38) As String Dim myFileTmn As New IO.FileStream("d: fxtdat” °ComboBox4.Text ° "Tmn6.dat", FileMode.Create, FileAccess.Write)’創(chuàng)建新的二進制文件。 Dim bwTmn As New BinaryWriter(myFileTmn, System.Text.Encoding.UTF32) ’ 定義二進制文件的數(shù)據(jù)壓縮格式為UTF32。 For K = 1 To 38 '按順序循環(huán)讀取低溫文件38個(6h間隔) txtFmn6 = TxtTmn6 °ComboBox4.Text °Tm2(K)'EC6 h低溫全路徑文件名。 If My.Computer.FileSystem.FileExists(txtFmn6) = False Then‘如果原始資料缺失則提示并退出。 MsgBox(txtFmn6 °"文件缺失!") bwTmn.Flush() bwTmn.Close() myFileTmn.Close() Exit Function End If Dim strRead As String() = IO.File.ReadAllLines(txtFmn6) Dim Temp(strRead.Length - 1)() As String For i = 0 To strRead.Length - 1 strRead(i) = Trim(strRead(i)) Do While InStr(strRead(i), " ") '如果有連續(xù)的兩個空格就替換成一個空格,用循環(huán)方式去除文本文件中多余的空格。 strRead(i) = Replace(strRead(i), " ", " ") Loop If i<6 Then Temp(i) = strRead(i).Split(" ")’用回車符分割數(shù)據(jù) Else Temp(i) = strRead(i).Split(" ")’用空格分割數(shù)據(jù) End If Next Jd={107, 117} '縮小經(jīng)度范圍 Wd={23, 31} '縮小緯度范圍 Dim Ds(Int((Wd(1)-Wd(0))/0.125), Int((Jd(1)-Jd(0))/0.125)) As Single x=0 For i=0 To Int((Wd(1)-Wd(0))/0.125)-1 For j=0 To Int((Jd(1)-Jd(0))/0.125)-1 Ds(i, j)=Temp(2*(54-Wd(0))/0.125-2*i+6)((Jd(0)-73)/0.125+j)’將文本文件數(shù)據(jù)讀入數(shù)組,并改變順序?qū)懭攵M制文件,+6是為了去除文本文件的前6行(文件頭)。 Gf=Val(Ds(i, j)) bwTmn.Write(Gf) ’寫入二進制文件 x=x+1 Next Next Next bwTmn.Flush() bwTmn.Close() myFileTmn.Close() End Function 上述子程序?qū)⒆x取數(shù)據(jù)范圍設(shè)置成107°~117°E、23°~31°N ,網(wǎng)格點變?yōu)?01×81=8 181個,6 h一次、38個預(yù)報時次的文件(TXT格式)本來總共占33 M空間,改寫成一個二進制dat數(shù)據(jù)文件后縮小為680 K,約為原來的1/50,文件大幅度變小,訪問效率提升。 這里需要注意兩個問題:一是寫DAT文件時的編碼格式,“System.Text.Encoding.UTF32”必須是UTF32編碼,其它編碼格式用GRADS軟件讀取時為錯誤數(shù)據(jù);二是寫數(shù)據(jù)的順序,Micaps的數(shù)據(jù)順序是從高緯度到低緯度,寫數(shù)據(jù)時必須改成從低緯度到高緯度。 Micaps的文本數(shù)據(jù)一般是一個文件保存二個維度數(shù)據(jù),寫成二進制文件時可以根據(jù)需要將一天的所有資料保存到一個文件里,那么就有5個維度(空間三維,時間一維,要素一維)的數(shù)據(jù),如此處理之后,每天100 G的原始數(shù)據(jù)除去不常用的,全部寫入一個dat,大小變?yōu)?00~500 M,壓縮比例為200~1 000倍,保存幾年的數(shù)據(jù)毫無壓力。 通過前面方法處理保存的數(shù)據(jù)文件的說明文件通常在同路徑下可以找到,如果這些數(shù)據(jù)需要在Micaps里使用,用簡單的少數(shù)幾行代碼恢復(fù)成一個個文本格式文件,再加上相應(yīng)的文件頭即可。 如需要用GRADS等繪圖軟件查看數(shù)據(jù),則另寫數(shù)據(jù)描述文件。前文EC低溫預(yù)報的數(shù)據(jù)描述文件如下: dset d: fxtdat19091008Tmn6.dat TITLE EC dw UNDEF -9.99E+33 options little_endian XDEF 80 LINEAR 107 0.125 YDEF 64 LINEAR 23 0.125 ZDEF 1 LEVELS 999 TDEF 38 LINEAR 08Z10Sep2019 6hr vars 1 dw 0 99 dw ENDVARS 株洲市氣象臺是湖南省的地區(qū)級臺站,備份數(shù)據(jù)需要從湖南省氣象局?jǐn)?shù)據(jù)服務(wù)器遠程拷貝下載,每天的數(shù)據(jù)量很大,如果是直接下載再保存于本地,受限于網(wǎng)絡(luò)帶寬和硬盤容量,基本無法實現(xiàn),用前文所述方法加以處理后,如果只選取常規(guī)地面、高空資料,EC-Thin資料等,一天的數(shù)據(jù)壓縮后大約只有500 M,這樣一來,1TB的硬盤可以輕松保存5 a以上資料?;诖怂悸罚覀冇肰B.NET編寫了可執(zhí)行程序,該程序的主要功能是定時備份遠程服務(wù)器上的M4后臺數(shù)據(jù),定時功能由WIN系統(tǒng)的計劃任務(wù)實現(xiàn),將該程序放入系統(tǒng)計劃任務(wù)欄每日02—03時自行啟動(如圖1),備份完畢后自動退出。 圖1 WIN7系統(tǒng)計劃任務(wù)中的M4資料備份程序Fig.1 M4 data backup program in win7 system planning task 具體需要備份哪些資料由設(shè)置文件設(shè)置(如圖2),該設(shè)置文件列舉需要備份的資料及其目錄地址,備份主程序啟動后搜索該目錄下一天之內(nèi)的所有新文件并逐一寫入DAT文件,圖2所示的設(shè)置文件備份高空、地面和EC細網(wǎng)格資料,日儲存數(shù)據(jù)量大約為原數(shù)據(jù)量的25%,占用空間150 M,一般1 h內(nèi)即可完成備份。通過最近2 a的實踐運行,此程序穩(wěn)定可靠,操作簡單,設(shè)置好參數(shù)文件后無需人工干預(yù)即可每日定時完成資料備份工作。 圖2 備份程序的設(shè)置文件Fig.2 The setup file of backup program 資料備份工作非常重要,前文所述的思路和方法可以概括為:刪除不常用數(shù)據(jù),保留必需的核心數(shù)據(jù),并用二進制編碼進一步壓縮數(shù)據(jù)文件容量,后期數(shù)據(jù)使用可借助GRADS軟件或者恢復(fù)成M4文本文件。2年的實踐使用證明該方法穩(wěn)定、實用且操作簡便,保存和使用資料的成本降低,效率提高,可為基層臺站解決海量歷史資料備份問題提供借鑒。3 二進制數(shù)據(jù)文件的訪問和使用
4 備份程序的業(yè)務(wù)使用情況
5 結(jié)語