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