,,
(中船航海科技有限責任公司,北京 100070)
船舶目標自動識別系統(tǒng)(AIS系統(tǒng)),通過船與船、船與岸之間傳遞航行信息,增強了海上生命安全、航海效率、航海安全的能力,提高了船舶駕駛員的獲知信息的質(zhì)量[1]。國際海事組織對大中型船舶配備AIS系統(tǒng)作出了強制安裝規(guī)定[2]。目前AIS系統(tǒng)在大中型船舶中已經(jīng)得到廣泛應(yīng)用,但市場上的常用AIS系統(tǒng)并不記錄航行數(shù)據(jù)[3],通常解決方法有:①使用Ecdis(電子海圖)設(shè)備進行數(shù)據(jù)記錄[4-5];②使用VDR擴展接口記錄數(shù)據(jù);③通過AIS接收設(shè)備擴展存儲接口進行數(shù)據(jù)記錄。 這3種方法遇到的困難都有所不同,VDR作為記錄航行信息重要設(shè)備,日常使用并不對外提供數(shù)據(jù)接口,Ecdis記錄航行數(shù)據(jù)也是解決方法,但是對于一些小船來說使用Ecdis較為復(fù)雜。因此文中提供了一種記錄AIS數(shù)據(jù)的解決方案,采用在船用AIS系統(tǒng)中增加航行安全數(shù)據(jù)庫記錄模塊,負責對收到的AIS目標進行處理,存儲航行過程中的AIS目標數(shù)據(jù),包括速度、位置、船號、呼號,并利用分區(qū)分表記錄提高船只的數(shù)據(jù)存儲能力和查詢效率,可用來進行航行回放、航行總結(jié),并且可以根據(jù)實際數(shù)據(jù)和雷達數(shù)據(jù)進行融合,進一步提升船舶航行安全。
文中的AIS接收設(shè)備采用了嵌入式Linux系統(tǒng),根據(jù)調(diào)查目前通用的數(shù)據(jù)庫系統(tǒng)有oracle、sqlserver、mysql、sqslite、postgresql等[6]。Oracle和sqlserver比較適用于大型應(yīng)用,sqllite只在內(nèi)存中保存數(shù)據(jù),并不能對數(shù)據(jù)進行持久化操作,因此在嵌入式安裝條件下可以選擇數(shù)據(jù)庫有mysql以及postgresql2種[7],但mysql已經(jīng)商業(yè)化,使用mysql未來可能會被收取費用,因此選擇postgresql數(shù)據(jù)庫進行航行安全數(shù)據(jù)庫設(shè)計。
根據(jù)長期統(tǒng)計數(shù)據(jù),判斷90 d是一個比較合理的記錄時長,超過這個時長航行安全數(shù)據(jù)庫可以進行數(shù)據(jù)回滾。如果AIS目標數(shù)據(jù)長時間存儲不進行數(shù)據(jù)分區(qū),數(shù)據(jù)實用性較差,而且長期在一個表格中進行記錄,算法的內(nèi)存消耗以及算法的磁盤 I/O 消耗都按指數(shù)級別上升[8]。因此,選擇分區(qū)分表記錄數(shù)據(jù)。
AIS信息包含多種不同類型的消息,主要分為動態(tài)信息、靜態(tài)信息[9],本著簡單原則,僅對AIS動態(tài)目標信息進行記錄。
航行安全數(shù)據(jù)庫將AIS目標動態(tài)信息建表進行存儲,以MMSI字段作為主鍵,便于對數(shù)據(jù)存儲處理和整合查詢。按照AIS系統(tǒng)原理,AIS系統(tǒng)每分鐘最大接收并存儲2 250批數(shù)據(jù)[10],按每批數(shù)據(jù)平均100個字節(jié)進行計算,每天的數(shù)據(jù)記量最大設(shè)計為324 MB字節(jié),設(shè)計最大航程為90 d,數(shù)據(jù)大小約29 G,考慮到擴展性,采用60G的SD卡則可以滿足數(shù)據(jù)存儲要求。
通過postgresql數(shù)據(jù)庫建立動態(tài)信息表,利用存儲過程、分區(qū)技術(shù)形成航行安全數(shù)據(jù)庫,采用內(nèi)存緩沖技術(shù)將AIS目標動態(tài)信息寫入數(shù)據(jù)庫,并在此基礎(chǔ)上對數(shù)據(jù)插入效率進行分析。航行安全數(shù)據(jù)庫采用postgresql 8.4版本,數(shù)據(jù)采用按日存放分區(qū)的形式,一共存放90個分區(qū),用于存放備份數(shù)據(jù)。在超過90 d后,將分區(qū)變成獨立表,用于數(shù)據(jù)備份。獨立表保存30 d,之后被永久刪除。主要步驟包括:利用數(shù)據(jù)庫對數(shù)據(jù)記錄表進行分區(qū)存儲。單一數(shù)據(jù)表每天新增表項較大,采用分區(qū)存儲將利于數(shù)據(jù)庫的優(yōu)化和查詢,采用數(shù)據(jù)分區(qū)的方式對AIS數(shù)據(jù)進行數(shù)據(jù)存儲管理。分區(qū)是指將海量數(shù)據(jù)由一個數(shù)據(jù)區(qū)存儲管理拆分為多個數(shù)據(jù)區(qū)存儲管理, 對于實時更新的航行安全數(shù)據(jù)庫而言,數(shù)據(jù)庫的存儲、查詢效率是設(shè)計方案的關(guān)鍵。
例如,2017年11月20日,對于表objship會建立一個名為objship_20171120的數(shù)據(jù)表。隨著數(shù)據(jù)的不斷到來,就會生成大量的按時間和日期劃分的表。每天接收的數(shù)據(jù)都會保存在相應(yīng)的數(shù)據(jù)表下。當用戶輸入一條查詢指令時,該數(shù)據(jù)庫對所有分區(qū)進行并行查詢,縮短了查詢時間,提高了查詢效率。航行安全數(shù)據(jù)庫按日期創(chuàng)建分區(qū)是一個比較合理的選擇,根據(jù)到達數(shù)據(jù)時間戳所在區(qū)間,系統(tǒng)每天為每張表建立一個新的分區(qū),新分區(qū)繼承自主表。分區(qū)對數(shù)據(jù)庫操作透明,即用戶的所有操作均對主表進行,分區(qū)不可見。具體分區(qū)方式如下:為每個分區(qū)劃定一個時間段,存儲時間戳在該范圍內(nèi)的數(shù)據(jù),不同分區(qū)覆蓋的時間段不重合。
航行安全數(shù)據(jù)庫工作方式示意見圖1。
AIS系統(tǒng)的嵌入式系統(tǒng)設(shè)定目標接收線程,對AIS系統(tǒng)接收到的目標進行處理,根據(jù)AIS技術(shù)標準規(guī)定每分鐘劃分為2 250個時間段,每個時間段可以發(fā)布不長于256 bit的數(shù)據(jù) ,每條船舶會通過詢問選擇一個與他船不發(fā)生沖突的時間段和對應(yīng)的時間段來發(fā)布本船的訊息。因此根據(jù)AIS系統(tǒng)設(shè)計原理將航行安全數(shù)據(jù)庫記錄的船舶目標設(shè)定為每分鐘最大值為2 250,每秒最大為38批目標,取整后內(nèi)存緩沖區(qū)設(shè)定為每秒40批目標。
首先建立AIS目標動態(tài)信息的內(nèi)容建立數(shù)據(jù)結(jié)構(gòu),表1給出了AIS表對應(yīng)的存儲靜態(tài)表格數(shù)據(jù)結(jié)構(gòu)。
表1 AIS表對應(yīng)的數(shù)據(jù)結(jié)構(gòu)
對數(shù)據(jù)存儲進行優(yōu)化前,需要了解數(shù)據(jù)庫處理數(shù)據(jù)存儲的過程。向數(shù)據(jù)庫執(zhí)行插入時,接收AIS目標的客戶端首先向數(shù)據(jù)庫發(fā)起SQL指令,該指令通過網(wǎng)絡(luò)中傳輸?shù)綌?shù)據(jù)庫。當數(shù)據(jù)庫接收到該指令后開始處理指令,主要對其完成解析、執(zhí)行、提交和返回操作,最后將結(jié)果返回給客戶端。圖2為AIS系統(tǒng)接收和處理的數(shù)據(jù)不進行內(nèi)存緩沖的處理流程。
根據(jù)上述的流程,單次執(zhí)行存儲AIS目標數(shù)據(jù)庫的公式如下。
ResultTime= Nettime+ParseTime+
ExecTime+CommitTime
式中:Nettime為處理進程的響應(yīng)時間;ResultTime為SQL語句在網(wǎng)絡(luò)傳輸?shù)耐禃r間;ParseTime為語句的解析時間,ExecTime為語句的執(zhí)行時間;CommitTime為語句的提交時間。
當處理發(fā)送n個AIS目標時,將處理n次解析、n次執(zhí)行和n次提交時間的綜合。如果n是較大時,其花費的時間將隨n值線性增加。因此內(nèi)存緩沖設(shè)計方案基于如上分析,減少插入次數(shù),提高單次插入目標數(shù),可以提升數(shù)據(jù)庫的運行效率。
內(nèi)存緩沖數(shù)據(jù)結(jié)構(gòu)可在程序動態(tài)執(zhí)行時可通過該數(shù)據(jù)接口建立一個內(nèi)存隊列,內(nèi)存隊列可起到緩沖作用,AIS處理線程對接收到的目標進行處理,解析后的AIS目標信息先放入,待緩沖區(qū)達到一定目標條數(shù)后再向數(shù)據(jù)庫發(fā)起SQL指令,以便減少數(shù)據(jù)庫執(zhí)行過程中消耗的總時間?;诰彌_存儲的處理流程見圖3。
對于這些數(shù)據(jù)庫表,根據(jù)AIS接收機的實際情況,為方便對比限定對測量場景,假設(shè)船舶在航行狀態(tài)下每秒接收的AIS目標最大批數(shù)是最大狀態(tài),首先設(shè)定了每秒插入的數(shù)據(jù)量相同,但每秒通過不同的緩沖值進行,測試在數(shù)據(jù)表中插入頻率對數(shù)據(jù)庫的時間性能。以下為具體實驗過程。
按照緩沖區(qū)設(shè)計,為方便測試,設(shè)定總插入數(shù)據(jù)量為1萬批,進行連續(xù)目標插入,每次插入批數(shù)由1批目標連續(xù)上升到200批,計算單次數(shù)據(jù)庫耗費時間,每次插入目標未超過38批時,每次插入增加條數(shù)提升插入效率較為明顯,超過38批后,插入效率略有提升,但效果并不明顯。
隨著每次插入批數(shù)增加,數(shù)據(jù)庫插入效率得到提高。對postgresql實際插入測量表明,同時向數(shù)據(jù)庫中插入38條數(shù)據(jù)相比順序插入38條數(shù)據(jù)快2.5倍以上。具體可參見圖4。
1)通過AIS接收設(shè)備記錄數(shù)據(jù)是一種相對比較低成本的實現(xiàn)方式,根據(jù)試驗,其分區(qū)和內(nèi)存緩沖的設(shè)計方式可普遍適用于其他需用到數(shù)據(jù)庫的船舶電子配套設(shè)備上,該設(shè)計可提升數(shù)據(jù)庫查詢和記錄數(shù)據(jù)的效率,降低了磁盤的I/O操作,并降低算法的復(fù)雜度。
2)提出的設(shè)計方法長時間記錄時占用嵌入式處理器處理時間較高,通常占到40%~60%,未來可以通過加強任務(wù)調(diào)度期間的時間分配,來提高內(nèi)存緩沖的工作效率。
3)通過postgresql分區(qū)設(shè)計、內(nèi)存緩沖設(shè)計,并對數(shù)據(jù)進行插入、查詢效率進行分析,實現(xiàn)postgresl數(shù)據(jù)庫的最優(yōu)數(shù)據(jù)存儲方式。通過該航行安全數(shù)據(jù)庫設(shè)計研究,可為設(shè)計人員開展AIS系統(tǒng)設(shè)計提供參考。
4)下一步的研究方向是將獲取的AIS目標數(shù)據(jù)庫結(jié)合獲取的雷達目標信息運用機器學(xué)習(xí)算法進行聚類分析,實現(xiàn)優(yōu)勢互補,進一步為船舶航行的安全提供保證。