999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

測繪成果管理中的EDB文件存儲與分發優化

2023-04-29 15:56:34葉水全
信息系統工程 2023年6期
關鍵詞:測繪數據庫優化

葉水全

摘要:結合測繪成果管理中需要處理大量EDB文件,針對文件存儲空間的大小問題以及分發的效率進行了思考與總結。通過對原有大比例尺地形圖的存儲進行了優化,針對EDB文件的格式特點,提出一種新的壓縮和管理方法,即用Oracle 11g數據庫和7z壓縮技術,提高測繪檔案管理中大比例尺地形圖的分發速度,降低了數據管理的存儲需求。為今后相關工作的開展提供了較大的便利與可靠的支持。

關鍵詞:EDB文件;7Z壓縮;Oracle數據庫存儲;C++開發

一、前言

從2005年開始,重慶市勘測院全面使用北京山維科技股份有限公司的EPS地理信息工作站進行大比例尺1∶500地形圖采集與存儲。作為其數據保存的主要形式,檔案管理工作中積累了數量龐大的EDB文件(*.edb),包括工程項目文件和國家標準基本比例尺文件,其年度歸檔數已超過10萬,每年的存儲空間增長量接近1TB。這種小文件形式的文件存儲,不僅會造成存儲空間的迅速擴大,更會影響后期數據的分發效率。在檔案搜索和分發時,相同的大比例尺文件名存在多個時期的多個版本,數據眾多,且每年度存儲位置分散,加重了數據追溯困難。因此,為了方便存儲EDB文件,筆者做了以下優化:增加上載入口時的自動冗余清理,按EPS平臺的規則清理EDB文件中的冗余內容,縮小數據大小;使用7z壓縮技術,在傳輸和存儲過程中進一步縮小數據大小;使用Oracle數據庫存儲EDB文件。

二、功能實現

(一)EDB冗余清理

EDB格式作為EPS地理信息工作站數據承載格式,其底層是一個Access數據庫,使用GeoPointTB、GeoLineTB、GeoAreaTB表存儲圖形數據,使用MarkNoteTB表存儲注記數據,使用UserLayerTB、AttrLinkInfoTB表管理圖形關聯屬性表,使用FeatureCode、SymbolScriptTB、NoteTemplateTB表實現圖形符號化[1]。EPS地理信息工作站為防止采集和編繪過程中數據因故障丟失,每條數據記錄都真實地保存至上述表格。同時,為保證整個加工過程的可追述,整個數據記錄過程都是增量的,即數據存入表格后將永遠存在而不會刪除。在用戶視角的軟件操作窗口中,需要表達一個對象刪除時,“刪除”動作在數據存儲的底層映射為對象的Mark屬性值做累加運算;如果用戶有回退操作則可以通過減去累加值完成還原。

于是EDB文件就會越來越大,例如,一個普通的大比例尺文件一般為6Mb,在清理前可能有20Mb,甚至極個別達到30Mb,數據存儲量最大增至5~6倍于原文件。歸檔后,采集和編繪的過程操作已經完成。為了節約存儲空間,應該將Mark字段標記為“刪除”的那些數據條目從EDB文件中刪除。此處以DAO(DATA ACESS OBJECTS)方式為例,連接EDB數據文件,將表中冗余過程記錄直接刪除,C++核心函數如下:

Int EDBCompress(CString edbPath){

CDaoDatabase* m_pDB = new CDaoDatabase;

CString strDeleteTab = _T( "DELETE * From [tab] where Mark Mod 2 = 0");

……

strSQL = strDeleteTab;

strSQL.Replace( "[tab]", strTabNames[i]);

m_pDB->Execute( strSQL, dbConsistent );

……

}

(二)7z數據壓縮

7-Zip是基于GNU LGPL授權協議的開源壓縮軟件[2],可以自由地整合到現有的軟件系統中。它的壓縮格式.7z具有較高的壓縮比,較Zip壓縮格式有30%-70%能力提升,較商業軟件WinRAR在壓縮比方面也略有優勢(圖1),在辦公自動化數據集成中一般優先使用。

筆者將數據解壓縮功能集成到系統中,在7z的SDK開發文檔中,推薦使用其開源接口SzAr_Extract,其接口如下:

SZ_RESULT SzAr_Extract(

CArchiveDatabaseEx *db,

ILookInStream *inStream,

UInt32 fileIndex,? ? ? ? ?/* index of file */

UInt32 *blockIndex,? ? ? ?/* index of solid block */

Byte **outBuffer,? ? ? ? ?/* pointer to pointer to output buffer */

size_t *outBufferSize,? ? /* buffer size for output buffer */

size_t *offset,? ? ? ? ? ?/* offset of stream for required file in *outBuffer */

size_t *outSizeProcessed, /* size of file in *outBuffer */

ISzAlloc *allocMain,

ISzAlloc *allocTemp

);

為了將內存中的7z數據生成EDB文件,需要一些定制。在7z的源代碼項目Client7z“7z1900-src\CPP\7zip\UI\Client7z”(7-Zip 19.00為例)里,在Client7Z.cpp補充一個由內存至文件的解壓函數,并將此Client7Z項目以lib的形式編譯進入現有系統中即可。補充的內存解壓函數如下:

int decode_memory2f(const Byte * memory_data, size_t memory_size, const char * save_folder) {

……

CBufInStream *bufInStreamSpec = new CBufInStream;

CMyComPtr bufInStream = bufInStreamSpec;

bufInStreamSpec->Init(memory_data, memory_size);

CArchiveOpenCallback *openCallbackSpec = new CArchiveOpenCallback;

CMyComPtr openCallback(openCallbackSpec);

……

CArchiveExtractCallback *extractCallbackSpec = new CArchiveExtractCallback;

CMyComPtr extractCallback(extractCallbackSpec);

extractCallbackSpec->Init(archive, folderName);

extractCallbackSpec->PasswordIsDefined = false;

HRESULT result = archive->Extract(NULL, (UInt32)(Int32)(-1), false, extractCallback);

if (result != S_OK) return 2;

return 0;

}

(三)Oracle數據庫存儲

原有的數據成果以文件的形式保存在服務器,雖然管理成本低,但再利用的效率不高。筆者依托Oracle數據的大數據文件的管理能力,在Oracle11g數據庫中,按照海量數據庫的架構創建存儲表[3],按實際的工作節奏每一年度建一個內容存儲表。例如,2020年版的創建表SQL如下:

-- 創建存儲表

CREATE TABLE eps_repos_2020(

id NUMBER(12,0) PRIMARY KEY,

name VARCHAR2(100 char),

data_format VARCHAR2(60 char),

save_format VARCHAR2(60 char),

save_code VARCHAR2(60 char),

blob_chip BLOB,

update_date DATE DEFAULT sysdate NOT NULL

并且,在下載時方便復原EDB文件,需要在Oracle的下載接口中一并使用7z解壓。筆者在Oracle11g數據庫接口中使用了Oracle Instant Client連接遠程數據庫[4],Oracle OCI(Oracle Call interface)模塊和其輕封裝ocilib(Vincent Roginer)作為開發模塊[5]。使用Oracle連接池技術,其Oracle連接池子函數如下:

void fileDw_byPool_subWorker(OCI_Thread *thread, void *data) {

fileDw_byPool_argument * pf = (fileDw_byPool_argument*)data;

OCI_Connection *cn = OCI_PoolGetConnection(pf->pool, NULL);

……

wchar_t name_out = { 0 };

if (false == _download_7zblob(cn, pf->db_object_target, id, pf->savedir, name_out)) {

……

}

OCI_ConnectionFree(cn);

}

其中,數據庫BLOB下載函數如下:

bool _download_7zblob(OCI_Connection *cn, const otext * db_object_target, big_uint id, const otext * savedir, wchar_t * name_out) {

bool rs = false;

const otext sql_format1[] = OTEXT("SELECT blob_chip FROM %s WHERE id = %%lu");

……

if (FALSE != OCI_ImmediateFmt(cn, sql_format2, id, OCI_ARG_LOB, blob)) {

rs = fwrite2_blob_7z_onlyone(blob, savedir, name_out);

//wprintf( L"%s OK\n", name);

}

OCI_LobFree(blob);

return rs;

}

其中,數據庫7z解壓為EDB文件的函數如下:

bool fwrite2_blob_7z_onlyone(OCI_Lob * blob, const otext * savedir, wchar_t * name_out) { // Y.S.Q 2018-05-17

……

unsigned char * buff = new unsigned char[len];

if (FALSE != OCI_LobRead2(blob, buff, &rd, &rd)) {

if (len == rd) {

err = decode_memory2f(buff, len, savedir, name_out);

}

}

……

}

三、測試與性型分析

筆者在Visual Studio 2017創建從數據庫下載EDB文件的C++項目fileDw_byPool.vcxproj,并包含Client7z項目的lib和ocilib項目的lib,編譯為exe執行程序。其中fdwp32.exe是主程序,7z.dll提供解壓縮功能,fdwp32.xml是數據庫的信息及參數,oracle11203目錄是數據庫Oracle Instant Client功能目錄。

以下是筆者優化后的分發機制與舊模式的比較:

1.下載速度。隨機選擇了100個EDB文件作為下載清單,在兩臺同配置的普通電腦上,一臺使用舊模式下載數據,一臺使用優化后的下載機制。前者的平均下載時間為14秒(圖2中的單點)。后者基于ORACLE連接池開啟了數據庫多線程模式。從圖2(豎軸時間秒,橫軸線程池數)的函數曲線可以發現,4線程模式時間為6秒,提高了2.5倍的下載速度。

2.存儲空間。以某年度全部基本比例尺EDB文件為例,舊模式下為服務器文件共享,文件個數為10.5萬,存儲大小584GB;優化后的Oracle數據庫表空間大小52GB,約為11倍的存儲空間優化。

四、結語

基本比例尺數據的管理一直是重慶市勘測院測繪檔案保管的重要工作。面對數十年長期積累的大比尺EDB格式數據成果,本文分別從存儲空間和分發效率兩方面入手,按內容特性對文件精簡其存儲大小;使用7z壓縮方法進一步降低存儲空間的大小;利用Oracle數據庫的線程池技術優化分發速度。實際訪問效率相比于傳統的文件共享方式快2~3倍,服務器存儲空間節約85%以上;與此同時,借用了Oracle數據庫的海量存儲能力以及安全訪問機制,提升了測繪成果管理中針對EDB格式的大比例尺數據的存儲與分發能力。

參考文獻

[1]Igor Pavlov.7-Zip SDK[EB/OL].[2021-12-22].https://www.7-zip.org/.

[2]楊亮亮.Oracle數據庫處理海量數據的技術分析[J].信息技術與信息化.2020(11):25-27.

[3]吳政,李成名,等.Oracle數據庫矢柵數據一體化存儲與管理[J].測繪學報.2017,46(5):639-648.

[4]ORACLE. Oracle Call Interface Programmer's Guide[EB/OL].[2021-12-22].https://docs.oracle.com/en/database/oracle/oracle-database/21/lnoci/index.html.

[5]Vincent Rogier.C and C++ Driver for Oracle[EB/OL].[2021-12-22].http://vrogier.github.io/ocilib/.

猜你喜歡
測繪數據庫優化
超限高層建筑結構設計與優化思考
房地產導刊(2022年5期)2022-06-01 06:20:14
民用建筑防煙排煙設計優化探討
關于優化消防安全告知承諾的一些思考
一道優化題的幾何解法
浙江省第一測繪院
工程測繪中GNSS測繪技術的應用
04 無人機測繪應用創新受青睞
無人機在地形測繪中的應用
電子制作(2017年9期)2017-04-17 03:01:00
數據庫
財經(2017年2期)2017-03-10 14:35:35
數據庫
財經(2016年15期)2016-06-03 07:38:02
主站蜘蛛池模板: 狠狠综合久久| 波多野结衣AV无码久久一区| 色有码无码视频| 国产高潮流白浆视频| 国产女同自拍视频| 久久黄色免费电影| 免费人成视频在线观看网站| 99久久人妻精品免费二区| 精品久久久久无码| 亚洲欧美在线综合图区| 亚洲精品手机在线| 波多野结衣一区二区三视频 | 国产欧美日韩专区发布| 99热国产这里只有精品无卡顿"| 亚洲中文字幕在线观看| 欧美精品亚洲日韩a| 日本高清有码人妻| 亚洲三级片在线看| 色偷偷av男人的天堂不卡| 麻豆精品在线播放| 干中文字幕| 欧美第二区| 亚洲综合欧美在线一区在线播放| 国产三级毛片| 天天做天天爱天天爽综合区| 中文字幕首页系列人妻| 伊人久久大线影院首页| 欧美成人午夜在线全部免费| 国产免费久久精品99re丫丫一| 福利在线不卡一区| 亚洲女人在线| 国产色网站| 欧洲日本亚洲中文字幕| 97国产精品视频人人做人人爱| 亚洲免费黄色网| 国产97视频在线| 美女潮喷出白浆在线观看视频| 一级福利视频| 国产在线视频二区| 国产精品尤物在线| 香蕉eeww99国产在线观看| 色婷婷色丁香| 国产无码网站在线观看| 婷婷色一二三区波多野衣| 免费看美女自慰的网站| 国产精品一区二区久久精品无码| 久久永久免费人妻精品| 亚洲色精品国产一区二区三区| 国产一在线| 国产一区二区三区日韩精品| 亚洲综合网在线观看| 精品福利视频导航| 99热这里只有精品国产99| 免费观看男人免费桶女人视频| 青草视频久久| 国产日韩丝袜一二三区| 91精品免费高清在线| 伊人色在线视频| 中文成人在线视频| 在线免费a视频| 精品久久香蕉国产线看观看gif | 不卡的在线视频免费观看| 九九久久精品免费观看| 色网站免费在线观看| 全部无卡免费的毛片在线看| 狠狠综合久久| 99re免费视频| 97se亚洲| 国产主播在线一区| 国产精品入口麻豆| 国产香蕉国产精品偷在线观看| 中文字幕乱码中文乱码51精品| 99久久精品无码专区免费| 好紧太爽了视频免费无码| 白浆免费视频国产精品视频| 手机在线免费不卡一区二| 亚洲国产AV无码综合原创| 国产h视频免费观看| 日本草草视频在线观看| 欧美自慰一级看片免费| 白浆免费视频国产精品视频| 91精品久久久无码中文字幕vr|