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


5 結語