武宏剛 李杰
摘要:針對AVEVA Marine數(shù)據(jù)異地同步耗時長的問題,研究減少數(shù)據(jù)異地同步耗時的方法。該文通過分析AVEVA Marine數(shù)據(jù)的特點和結構,以化零為整、化大為小的思路,結合Zlib壓縮技術對數(shù)據(jù)進行壓縮、傳輸和解壓縮三步連續(xù)操作,代替簡單的復制文件同步方式,實現(xiàn)了AVEVA Marine數(shù)據(jù)高效異地同步的方法。
關鍵詞:Zlib;AVEVA Marine;數(shù)據(jù)同步
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2022)03-0021-02
開放科學(資源服務)標識碼(OSID):
1 概述
AVEVA Marine是英國AVEVA公司開發(fā)的船舶設計專業(yè)軟件系統(tǒng),我司已利用該系統(tǒng)設計完成多個項目。這些項目中其中部分在江蘇南通建造,部分在遼寧大連建造。在大連建造的項目,設計數(shù)據(jù)需要每天夜間整體從我司所在地南通通過網(wǎng)絡同步到大連。經(jīng)過測試,使用操作系統(tǒng)自帶的復制粘貼功能或者第三方軟件比如Second Copy等進行數(shù)據(jù)同步,平均每個項目耗時5~6個小時,因此并不能在夜間完成目前所有目標項目的同步。設計數(shù)據(jù)的及時性直接影響項目作業(yè)進度。雖然提升網(wǎng)絡專線帶寬和服務器硬件條件可以提高同步速度,但是同時也增加了額外成本。目前尚無針對AVEVA Marine數(shù)據(jù)同步的相關文獻記錄,但劉麗偉等[1]提出的文件壓縮傳輸思路值得借鑒。本文將以C#語言為開發(fā)工具,探討如何實現(xiàn)在不提升網(wǎng)絡帶寬和硬件條件的情況下滿足要求的同步方法。
2 問題分析
造成同步不能及時完成的原因很多,比如網(wǎng)絡帶寬、網(wǎng)絡穩(wěn)定性、設備硬件條件、數(shù)據(jù)量及文件大小等因素都直接影響同步效率。如前文所述,網(wǎng)絡帶寬、網(wǎng)絡穩(wěn)定性和設備硬件條件等的改善需要增加額外成本,因此本文從AVEVA Marine數(shù)據(jù)結構入手進行分析。
AVEVA Marine各個項目的設計數(shù)據(jù)以文件形式分別保存在以三位項目代碼命名的主文件夾中,其內(nèi)部根據(jù)文件用途和類型的不同又分別設置了多個子文件夾,其文件結構如圖1所示(其中XXX為項目代碼)。經(jīng)統(tǒng)計,我司項目平均總文件大小為100GB左右,總文件數(shù)量為190000個左右,每個文件大小為0.52MB。由此可見,需要同步的數(shù)據(jù)文件總體積較大,而且絕大部分都是體積較小的小文件。
在文件傳輸中,當傳輸?shù)氖谴罅康男∥募r,傳輸過程中會因為文件過小,而文件數(shù)量過多,使得文件讀寫請求次數(shù)增加,造成大量的硬盤讀寫操作;同時,文件在的時候偏向于隨機寫入而不是順序寫入,因此過多的小文件會使得硬盤尋址時間變長,從而從一定程度上影響了文件存儲效率[2]。
3 解決方案
基于前文分析,減小傳輸數(shù)據(jù)大小,減少傳輸文件總數(shù)量,減少讀寫請求次數(shù),可以提高數(shù)據(jù)同步效率。解決目前這種狀況最好的方案就是采用數(shù)據(jù)壓縮存儲技術將所有零散的文件打包為一個文件,并進行壓縮以減少文件大小[1]。
3.1 Zlib簡介
Zlib是一個免費的、開源的、無損的、跨平臺的數(shù)據(jù)壓縮開發(fā)庫[3],它使用了無損且可逆的壓縮技術,具有達到與WinZip和Winrar等商業(yè)軟件相近的壓縮率,已成功在MySQL、JAVA、3Dmax等眾多大型系統(tǒng)中應用[4],其源碼可在http://www.zlib.net網(wǎng)站中免費下載使用[5]。Zlib在.Net平臺也有對應的開發(fā)庫,并提供了接口可供程序員調用,可以實現(xiàn)數(shù)據(jù)的壓縮和解壓縮,對于使用C#等.Net平臺開發(fā)語言的程序員來說非常方便[6]。
Zlib在.Net平臺進行開發(fā)需要進行的準備工作如下:
1)將zlibnet.dll拷貝到程序工程目錄下;
2)在程序引用管理器里添加對zlibnet.dll的文件引用;
3)在程序文件頭部添加ZLibNet的類庫引用:using ZLibNet。
3.2 壓縮功能實現(xiàn)代碼
private bool zip(string directory) //directory為待壓縮文件夾路徑
{
Zipper zip = new Zipper(); //將Zipper類實例化
zip.ZipFile = directory + ".zip";//設定壓縮后文件名
zip.ItemList.Add(directory + "\\*"); //設定壓縮文件范圍,*表示所有文件
zip.PathInZip = enPathInZip.Relative;//保持文件夾下所有文件的相對路徑
zip.Recurse = true;//遞歸
zip.Zip();//開始壓縮
return true;//返回結果
}
3.3 解壓縮功能實現(xiàn)代碼
private bool unzip(string filepath) // filepath為待解壓縮文件路徑
{
UnZipper unzip = new UnZipper();//將UnZipper類實例化
unzip.Destination = file.Replace(".zip", "") + "\\";//文件解壓縮后保存的目標文件
unzip.IfFileExist = enIfFileExist.Overwrite;//覆蓋已存在文件
unzip.ItemList.Add("*");//設定解壓縮范圍,*表示解壓縮所有文件
unzip.Recurse = true;//遞歸
unzip.ZipFile = file;//設定待解壓縮文件路徑
unzip.UnZip();//開始解壓縮
return true;//返回結果
}
3.4 數(shù)據(jù)文件同步設計實現(xiàn)
此同步功能通過C/S(客戶端/服務器)結構設計,整個程序分為客戶端和服務器端兩個程序。南通運行客戶端程序,主要完成文件壓縮、文件傳輸和結果發(fā)送的功能;大連運行服務器端程序,主要完成結果接收和文件解壓縮的功能。其中結果發(fā)送和結果接收功能通過TCP協(xié)議的套接字(socket)傳輸實現(xiàn)。
南通客戶端程序在數(shù)據(jù)壓縮并拷貝后發(fā)送信息到大連[7],大連服務器端在監(jiān)聽信息通知后開始解壓縮,各個功能環(huán)節(jié)實現(xiàn)無縫銜接自動運行。數(shù)據(jù)文件同步流程如圖2所示。
客戶端界面如圖3所示,設置需要同步的項目,設定開始時間使程序夜間自動運行,程序運行中會在界面窗口顯示運行日志。
服務端程序界面如圖4所示,設定開始時間,使程序夜間自動運行,收到信息通知后開始運行,并在窗口顯示運行日志。
程序開發(fā)完成后,進行夜間連續(xù)同步測試,測試結果如表1。根據(jù)測試結果推算,假設每天從夜間9:30到第二天早上7:00共9.5小時進行數(shù)據(jù)同步,大約可以同步6個項目,可以完成目前所有大連建造項目的數(shù)據(jù)同步。
4 結束語
基于Zlib的數(shù)據(jù)同步程序已經(jīng)開始試用,并在試用過程中不斷持續(xù)優(yōu)化,截至目前程序運行穩(wěn)定,數(shù)據(jù)夜間同步可以按計劃完成,滿足使用需求。此數(shù)據(jù)同步方法可以實現(xiàn)在不增加額外成本的前提下實現(xiàn)數(shù)據(jù)完整的異地同步,可以拓展到其他數(shù)據(jù)、其他企業(yè)或者其他行業(yè)中得到應用,具有較強的通用性。
參考文獻:
[1] 劉麗偉,鄧春健.多文件壓縮傳輸及解壓縮的方法[J].武漢理工大學學報(交通科學與工程版),2009,33(6):1211-1214.
[2] 周蘭鳳,趙鵬飛,彭俊杰.基于云環(huán)境下一種小文件傳輸策略研究[J].計算機工程與科學,2016,38(1):20-27.
[3] Zlib 官方網(wǎng)站.Zlib Home Site[EB/OL].[2021-08-20].http://www.zlib.net.
[4] 孫萍.基于ZLib的數(shù)字文獻壓縮技術的設計與實現(xiàn)[J].農(nóng)業(yè)圖書情報學刊,2007,19(11):5-7,13.
[5] 李鐵兵,雷滿生,雷志芳,等.基于Zlib的機車無線重聯(lián)數(shù)據(jù)分析軟件的實現(xiàn)[J].機車電傳動,2017(1):65-68.
[6] 陳鈞,劉愛華.基于Zlib的圖像差異壓縮算法研究與實現(xiàn)[J].東華理工大學學報(自然科學版),2010,33(1):92-96.
[7] 代亮,馬海武.基于Zlib的視頻監(jiān)控系統(tǒng)[J].網(wǎng)絡安全技術與應用,2006(5):58-59.
【通聯(lián)編輯:謝媛媛】