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