国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

面向氣象Web 應(yīng)用的數(shù)據(jù)庫訪問性能優(yōu)化及應(yīng)用?

2020-12-23 11:50:20楊立苑周雪瑩鄒海燕劉喆玥胡麗麗
計算機與數(shù)字工程 2020年11期
關(guān)鍵詞:數(shù)據(jù)表氣象動態(tài)

楊立苑 李 芬 周雪瑩 鄒海燕 劉喆玥 胡麗麗

(江西省氣象信息中心 南昌 330096)

1 引言

近年來,隨著互聯(lián)網(wǎng)技術(shù)的的快速發(fā)展,國家積極推進“互聯(lián)網(wǎng)+”行動[1],互聯(lián)網(wǎng)技術(shù)已經(jīng)成為包含氣象行業(yè)在內(nèi)各個行業(yè)提供服務(wù)的基石[2~4],其中Web 應(yīng)用是提供互聯(lián)網(wǎng)服務(wù)的重要手段。為了滿足氣象服務(wù)現(xiàn)代化的需要,各省氣象部門基于Web 應(yīng)用開發(fā)框架建立了滿足各種氣象服務(wù)需求的Web應(yīng)用[5~7]。關(guān)系型數(shù)據(jù)庫是構(gòu)建Web應(yīng)用系統(tǒng)必不可少的一部分,氣象Web數(shù)據(jù)庫訪問性能的高低嚴(yán)重影響著氣象Web應(yīng)用的服務(wù)質(zhì)量。

目前,Web 應(yīng)用系統(tǒng)主要通過對象關(guān)系映射(Object Relational Mapping,ORM)技術(shù)訪問數(shù)據(jù)庫[8],開發(fā)人員使用的主流ORM 框架是基于靜態(tài)語言開發(fā)的,例如Java 語言的Hibernate 框架[9]、C#語言的EF 框架[10]。在Web 應(yīng)用開發(fā)中,ORM 技術(shù)能將面向?qū)ο蠼⒌膶ο竽P陀成涞疥P(guān)系型數(shù)據(jù)庫表結(jié)構(gòu),這樣開發(fā)人員就不必再通過SQL語句去操作數(shù)據(jù)庫,只需要操作對象實例便可以實現(xiàn)數(shù)據(jù)庫的增刪改查。

造成這種挑戰(zhàn)的原因主要來自兩個方面。一是承載省級及以下氣象業(yè)務(wù)的服務(wù)器等基礎(chǔ)硬件設(shè)施陳舊,性能不高,二是數(shù)據(jù)表中站點數(shù)量多,隨著系統(tǒng)運行時間的增長,數(shù)據(jù)表中數(shù)據(jù)記錄會爆炸性的增長,最終影響該表數(shù)據(jù)訪問性能。例如,如果站點數(shù)是3000 個,一年的小時數(shù)據(jù)記錄數(shù)可以達到2600 多萬條。所以,本文主要研究的是如何在該特殊環(huán)境下去優(yōu)化氣象Web 數(shù)據(jù)庫中氣象類數(shù)據(jù)表的ORM 訪問性能,并且將其應(yīng)用到實際開發(fā)應(yīng)用中。

2 本文工作分析

Web 數(shù)據(jù)庫訪問性能的優(yōu)化一般是從服務(wù)器硬件性能、數(shù)據(jù)庫軟件、數(shù)據(jù)庫設(shè)計、ORM 框架性能、緩存等方面進行[11~14]。服務(wù)器硬件性能不滿足業(yè)務(wù)需求以及增設(shè)緩存服務(wù)需要大量資金進行升級,這方面尤其在市縣級很難一時得到解決。數(shù)據(jù)庫軟件和ORM 框架技術(shù)成熟,在本文特殊環(huán)境下優(yōu)化帶來的效果不佳。

本文優(yōu)化途徑是優(yōu)化數(shù)據(jù)庫表設(shè)計,壓縮數(shù)據(jù)表中的記錄數(shù)。本文主要從兩個方面進行數(shù)據(jù)表記錄數(shù)的壓縮,一是對數(shù)據(jù)表進行分表操作,二是通過增加表屬性個數(shù)的方式減少同一時間段的數(shù)據(jù)記錄數(shù)。

但是經(jīng)過優(yōu)化設(shè)計的數(shù)據(jù)表并不能很好地得到靜態(tài)語言O(shè)RM 框架的支持。這是因為優(yōu)化后的數(shù)據(jù)表需要根據(jù)時次動態(tài)的操作表屬性,使用原生的SQL語句可以通過字符串拼接的方式簡單實現(xiàn),但使用面向?qū)ο蟮姆绞叫枰軌騽討B(tài)地改變賦值屬性。例如一段邏輯代碼的語義是給實例A的t時屬性賦值,那么在t+x 時該段邏輯代碼需要給A 的t+x時屬性賦值。在靜態(tài)語言程序中對類實例中公共屬性的操作可以通過變量賦值的方式進行操作,對類實例中私有屬性的操作需要通過調(diào)用類中定義的公共方法進行操作。簡單的變量賦值方式和調(diào)用公共方法方式都無法改變程序中操作類實例的屬性對象,這需要采用復(fù)雜的反射技術(shù)才能實現(xiàn)。

為了能夠更加快速簡單地開發(fā)氣象Web應(yīng)用,考慮到相比于國家級,省級及以下氣象業(yè)務(wù)人員信息技術(shù)能力不強的現(xiàn)狀,本文基于動態(tài)語言Python的Django ORM 框架實現(xiàn)了對優(yōu)化后數(shù)據(jù)表的訪問方法,Python 語言可以非常容易的進行動態(tài)屬性賦值。最后將該方法應(yīng)用到實際Web應(yīng)用開發(fā)中。

3 訪問性能優(yōu)化技術(shù)

3.1 數(shù)據(jù)庫分表方法

為了能夠動態(tài)地增加分表的數(shù)量,減少分表產(chǎn)生的數(shù)據(jù)遷移量,本文使用一致性Hash 算法進行分表操作。由于氣象類數(shù)據(jù)中,時間屬性是用于數(shù)據(jù)檢索的重要指標(biāo),所以本文使用每條數(shù)據(jù)的時間戳作為Hash 函數(shù)的輸入。數(shù)據(jù)庫分表方法如圖1所示。一致性Hash 算法將Hash 函數(shù)的值空間構(gòu)成一個虛擬圓環(huán),值空間的取值范圍是[0,232-1]。本文將現(xiàn)有的表通過Hash 函數(shù)映射到虛擬圓環(huán)上。每條數(shù)據(jù)存儲的表取決于每條數(shù)據(jù)時間戳Hash值的大小。當(dāng)時間戳的Hash值大于某張表在Hash 環(huán)上的值,且該表的Hash 值離該條數(shù)據(jù)的Hash 值最近,那么該條數(shù)據(jù)存放在該表中。每次進行數(shù)據(jù)的插入、更新、查詢也會根據(jù)時間戳判斷數(shù)據(jù)位于哪張表中。

圖1 數(shù)據(jù)庫分表方法

當(dāng)某張表中的數(shù)據(jù)記錄數(shù)超過了設(shè)定的閾值,那么該張表將會進行分表。表中時間戳Hash 值大于新表Hash 值的數(shù)據(jù)將會遷移到新表中。其余表中的數(shù)據(jù)保持不變。為了不影響氣象數(shù)據(jù)服務(wù)的質(zhì)量,每次對所有表中記錄數(shù)的檢查以及分表的數(shù)據(jù)遷移操作都在凌晨一點執(zhí)行。由于氣象數(shù)據(jù)是時序,為了方便查詢,提高查詢效率,時間戳經(jīng)過Hash函數(shù)計算出的Hash值也會保持和輸入值一樣的大小順序,這樣時間相近的數(shù)據(jù)會盡量存放在一張表中。為了保證查詢數(shù)據(jù)的完整性,數(shù)據(jù)庫會有一張單獨的表來記錄每張分表存儲數(shù)據(jù)的最大和最小Hash值。

3.2 表結(jié)構(gòu)設(shè)計方法

如果要在保障氣象Web 數(shù)據(jù)庫某張表數(shù)據(jù)信息量不變的前提下,減少該表數(shù)據(jù)的記錄總數(shù),那么可以將時次屬性和氣象數(shù)據(jù)屬性的笛卡爾積作為數(shù)據(jù)庫表的屬性。例如,區(qū)域站小時降水表可以將每個時次降水量都作為表中一個屬性,將同一個站點一天24條小時降水?dāng)?shù)據(jù)壓縮至一條數(shù)據(jù)。

FastEthernet0/1 128.2 128 19FWD 0 4096 cc00.1ca0.0001 128.2

圖2 數(shù)據(jù)庫表優(yōu)化設(shè)計方法

假設(shè)需要在數(shù)據(jù)庫中建表的對象屬性集合為S,對象的時間信息屬性和站點信息屬性集合為X,上一級時間單位包含當(dāng)前時間單位的集合為T,設(shè)計的表中列屬性集合為C。數(shù)據(jù)庫表優(yōu)化設(shè)計方法如圖2 所示。集合X 中時間信息屬性主要是指該條數(shù)據(jù)的資料時間、資料更新時間等。如果當(dāng)前資料是小時數(shù)據(jù),那么資料時間單位是小時,該資料的上一級時間單位是天,一天包含00 時t1、01 時t2在內(nèi)共24個時間屬性,這些時間屬性組成了集合T。集合X 中的時間屬性直接映射到集合C 中,時間單位上升一級。集合X 中的站點信息主要包括站點的站號、經(jīng)度、緯度等屬性,這些屬性可以直接映射到集合C 中。集合X 是集合S 的子集,集合S除去集合X 中的元素,剩下的元素是一系列氣象觀測要素屬性或者和氣象類相關(guān)的要素屬性,例如到報情況。所有的要素屬性需要和集合T 中的所有屬性進行笛卡爾積字符拼接,拼接的字符作為新的屬性映射到集合C 中。綜上所述,優(yōu)化后表的屬性集合C定義公式為C=X ∪((S-X)×T)。

在數(shù)據(jù)庫表設(shè)計完成之后,需要對設(shè)計的數(shù)據(jù)庫表進行范式檢查。范式檢查主要包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)這三類范式檢查[15]。按照本文數(shù)據(jù)庫表設(shè)計方法定義的數(shù)據(jù)庫表每一列屬性沒有重復(fù)也沒有存儲多個值,設(shè)計的主鍵由資料時間和站號組成,該主鍵能夠唯一區(qū)分每一條數(shù)據(jù)記錄。但是數(shù)據(jù)表中站點屬性,如經(jīng)度、緯度、海拔高度可能出現(xiàn)在其他數(shù)據(jù)表中。所以本文設(shè)計的表符合數(shù)據(jù)庫設(shè)計第一范式和第二范式,可能會不符合第三范式。第三范式的主要作用是保障不會出現(xiàn)大量的數(shù)據(jù)冗余,這里存儲少量冗余經(jīng)度、緯度數(shù)據(jù)所占用的多余空間是可以接受的。并且如果這些冗余信息存儲在同一張表中,在進行該表數(shù)據(jù)訪問時,就不必為獲取這些信息再進行連表操作,這樣有助于提升數(shù)據(jù)檢索性能。

3.3 基于Python動態(tài)特性的ORM訪問

Django 是使用Python 語言編寫的開源Web 應(yīng)用開發(fā)框架[16],Django 框架關(guān)注點集中在模型(Model)、模版(Template)、視圖(Views)這三個部分。其中Model 部分指的是數(shù)據(jù)存取層,處理與數(shù)據(jù)存取相關(guān)的所有事務(wù)。Django 允許用戶通過管理命令Manage migrate 進行數(shù)據(jù)庫的遷移,該命令可以一次性幫助開發(fā)人員創(chuàng)建Models 中定義的數(shù)據(jù)表。

Web 應(yīng)用系統(tǒng)通過ORM 技術(shù)將軟件系統(tǒng)中的類映射至對應(yīng)數(shù)據(jù)庫表,對數(shù)據(jù)庫表的操作主要是增(INSERT)、刪(DELETE)、改(UPDATE)、查(SELECT)這四種操作。首先是對數(shù)據(jù)庫分表的映射,本文采用開源項目django-sharding 進行分表映射,該項目允許用戶在執(zhí)行數(shù)據(jù)庫操作時動態(tài)的選擇要操作的分表。其次是對數(shù)據(jù)表的面相對象操作。Python 能夠使ORM 進行動態(tài)操作的本質(zhì)在于可以通過字典“鍵-值對”中的鍵字符串進行類屬性值修改。為了能夠?qū)ο髮嵗M行動態(tài)屬性賦值,需要在對象的類中定義一個動態(tài)屬性賦值函數(shù),如下:

def init_from_dict(self,init_dic):

for k in init_dic:

self.__dict__[k]=init_dic[k]

其中init_dic 是字典數(shù)據(jù)結(jié)構(gòu),該字典每個元素的鍵是類的屬性名,值是鍵對應(yīng)屬性的值。Python中定義的類本質(zhì)也是一個字典,在這通過循環(huán)的方式對init_dic中包含的所有屬性進行動態(tài)的修改,這樣就不用去使用靜態(tài)語言中復(fù)雜的反射技術(shù)。

在定義好映射類的基礎(chǔ)上,開發(fā)Web應(yīng)用時便可以在業(yè)務(wù)邏輯中進行相關(guān)數(shù)據(jù)庫操作了。數(shù)據(jù)庫的動態(tài)增操作首先要需要定義一個空字典,將所有需要更改的屬性及該屬性的值賦給字典,然后用自定義的方法init_from_dict進行類實例的初始化,最后通過Django ORM 的函數(shù)進行數(shù)據(jù)庫表數(shù)據(jù)的批量增操作。數(shù)據(jù)庫的動態(tài)查操作需要調(diào)用Django ORM 提供的Q 函數(shù),使用Q 函數(shù)只需要定義條件邏輯連接器和查詢條件即可進行數(shù)據(jù)庫查詢,條件邏輯連接器支持與(AND)、或(OR)、非(~)邏輯,查詢條件也只需通過字典鍵值對的方式添加。數(shù)據(jù)庫的動態(tài)刪操作是基于查操作,進行查操作獲取返回的查詢結(jié)果對象后,只需調(diào)用delete 函數(shù)即可將該對象從數(shù)據(jù)庫中刪除。數(shù)據(jù)庫的動態(tài)改操作類似于數(shù)據(jù)庫的動態(tài)增操作,但首先需要先通過查操作獲取需要更改的記錄對象,然后通過該對象的init_from_dict 函數(shù)進行相關(guān)屬性值的修改,最后通過save 函數(shù)即可完成該條數(shù)據(jù)的修改。Django ORM動態(tài)訪問數(shù)據(jù)庫操作示例如表1所示。

表1 Django ORM動態(tài)訪問數(shù)據(jù)庫操作示例

4 優(yōu)化驗證和業(yè)務(wù)應(yīng)用

4.1 驗證實驗環(huán)境

本文使用三臺虛擬機(VM)作為氣象Web數(shù)據(jù)庫訪問性能優(yōu)化效果驗證的實驗環(huán)境。這三臺虛擬機部署在江西省氣象云平臺[17]當(dāng)中,具體的配置環(huán)境如表2所示。三臺虛擬機都使用CentOS 7.4作為操作系統(tǒng),其中一臺虛擬機部署數(shù)據(jù)庫MySQL 5.4,一臺虛擬機部署采用優(yōu)化技術(shù)的Django Web測試應(yīng)用,一臺虛擬機部署未采用優(yōu)化技術(shù)的Django Web 測試應(yīng)用。Django Web 測試應(yīng)用使用的Python 動態(tài)語言運行環(huán)境版本是Python 3.6。云平臺分配給部署MySQL 虛擬機的CPU 是4 核@2.1GHz,內(nèi)存大小是8GB;分配給部署Django Web測試應(yīng)用虛擬機的CPU 是2 核@2.1GHz,內(nèi)存大小是4GB。

表2 驗證實驗環(huán)境虛擬機配置

4.2 驗證實驗及分析

實驗首先需要向MySQL 數(shù)據(jù)庫注入氣象數(shù)據(jù),實驗使用的數(shù)據(jù)是江西省2017 年全年所有區(qū)域站小時降水?dāng)?shù)據(jù),江西省區(qū)域站個數(shù)是2456個。為優(yōu)化后Django Web 測試應(yīng)用建立的數(shù)據(jù)庫表是按照本文提出的設(shè)計方法設(shè)計的,以日期和站號作為主鍵,24 個時次和小時降水量的笛卡爾積作為元素屬性。為優(yōu)化前Django Web 測試應(yīng)用建立的數(shù)據(jù)庫表是按照傳統(tǒng)氣象數(shù)據(jù)庫設(shè)計方式建立,以時次和站號作為主鍵,小時降水量作為屬性。然后用Django 技術(shù)開發(fā)兩個簡易的Web 測試應(yīng)用,測試應(yīng)用開發(fā)完畢后部署到相應(yīng)的虛擬機中。最后,使用Web 測試應(yīng)用進行數(shù)據(jù)庫讀寫測試。

進行Web 測試應(yīng)用的數(shù)據(jù)庫讀寫測試需要分6 次進行。每次向數(shù)據(jù)庫中注入氣象數(shù)據(jù),使得數(shù)據(jù)表中的數(shù)據(jù)集時間跨度達到1周、1個月、3個月、6 個月、9 個月、12 個月。每次注入完數(shù)據(jù)后,分別測試Django Web 應(yīng)用的讀寫操作。讀操作是連續(xù)進行100 次查操作,隨機查詢某個站點某天某時次的降水量,統(tǒng)計完成100 次查操作的時間。寫操作是連續(xù)進行100次增操作,隨機插入2016年某個站點某天某時次的降水量,統(tǒng)計完成100 次增操作的時間。

驗證實驗讀寫測試結(jié)果如圖3、圖4 所示。在數(shù)據(jù)集時間跨度比較小情況下,采用本文所提出優(yōu)化技術(shù)開發(fā)的Django Web測試應(yīng)用ORM 訪問性能和傳統(tǒng)設(shè)計方法開發(fā)的Web測試應(yīng)用ORM 訪問性能差不多,ORM 讀測試的百次訪問耗時都集中在9s 左右,ORM 寫測試的百次訪問耗時都集中在12s左右。但是,隨著數(shù)據(jù)集時間跨度的增加未采用優(yōu)化技術(shù)的應(yīng)用ORM 訪問性能快速衰減,12 個月數(shù)據(jù)集的ORM讀測試的百次訪問耗時達18s,12個月數(shù)據(jù)集的ORM 寫測試的百次訪問耗時達25s,而采用優(yōu)化技術(shù)的應(yīng)用ORM 訪問性能總體保持平穩(wěn)不變。

圖3 數(shù)據(jù)庫ORM讀測試結(jié)果

圖4 數(shù)據(jù)庫ORM寫測試結(jié)果

4.3 氣象業(yè)務(wù)應(yīng)用

本文將提出的氣象Web 數(shù)據(jù)庫數(shù)據(jù)小時表訪問性能優(yōu)化方法應(yīng)用于江西省區(qū)域站數(shù)據(jù)直傳運維保障系統(tǒng)。江西省區(qū)域站數(shù)據(jù)直傳運維保障Web 系統(tǒng)采集入庫了每個時次全省區(qū)域站數(shù)據(jù)在每個傳輸環(huán)節(jié)的傳輸情況,包括CIMISS CTS[18]、省級區(qū)域站中心站、區(qū)域站報文來源、區(qū)域站電量供應(yīng)等環(huán)節(jié)。省、市、縣三級區(qū)域站數(shù)據(jù)傳輸業(yè)務(wù)運維保障人員可以通過該系統(tǒng)查詢區(qū)域站每個時次每個傳輸環(huán)節(jié)是否正常。該系統(tǒng)也提供了對區(qū)域站數(shù)據(jù)傳輸情況的統(tǒng)計、分析、診斷。該系統(tǒng)分為數(shù)據(jù)存儲與訪問層、業(yè)務(wù)邏輯層、數(shù)據(jù)展示層。

本文將氣象Web 數(shù)據(jù)庫訪問優(yōu)化技術(shù)應(yīng)用于數(shù)據(jù)存儲與訪問層,設(shè)計實現(xiàn)了省級區(qū)域站數(shù)據(jù)直傳情況數(shù)據(jù)庫,基于Django ORM 進行數(shù)據(jù)庫的動態(tài)訪問,并且向業(yè)務(wù)邏輯層提供數(shù)據(jù)訪問接口。最后運維人員可以通過Web 展示層進行區(qū)域站數(shù)據(jù)直傳情況的查詢和故障診斷,圖5 是區(qū)域站數(shù)據(jù)直傳歷史情況查詢頁面示例。該運維保障系統(tǒng)的實現(xiàn)基本上滿足了省、市、縣三級運維保障人員對區(qū)域站數(shù)據(jù)直傳保障的需求,經(jīng)過優(yōu)化之后,系統(tǒng)查詢效率得到了一定的提升,提高了平常業(yè)務(wù)工作的效率,推動了該運維保障系統(tǒng)在江西省省、市、縣三級氣象部門的應(yīng)用。

圖5 區(qū)域站數(shù)據(jù)直傳歷史情況查詢頁面

5 結(jié)語

本文設(shè)計了一種面向氣象Web 應(yīng)用的數(shù)據(jù)庫ORM 訪問性能優(yōu)化方法,并且針對優(yōu)化后的數(shù)據(jù)庫基于Python 語言提供了ORM 框架下的動態(tài)訪問操作方法。實驗結(jié)果表明該優(yōu)化方法是有效的,本文也將該方法應(yīng)用到江西省區(qū)域數(shù)據(jù)直傳保障系統(tǒng)開發(fā)中。但是該方法面臨著在數(shù)據(jù)庫表屬性過多的情況下會明顯增加軟件開發(fā)人員工作量的問題,下一步的主要工作是研究如何進行數(shù)據(jù)庫表和對象模型類代碼的自動化生成,提高Web應(yīng)用開發(fā)人員工作效率。

猜你喜歡
數(shù)據(jù)表氣象動態(tài)
氣象
國內(nèi)動態(tài)
氣象樹
國內(nèi)動態(tài)
國內(nèi)動態(tài)
《內(nèi)蒙古氣象》征稿簡則
湖北省新冠肺炎疫情數(shù)據(jù)表
黨員生活(2020年2期)2020-04-17 09:56:30
動態(tài)
基于列控工程數(shù)據(jù)表建立線路拓撲關(guān)系的研究
大國氣象
长宁区| 太和县| 承德市| 腾冲县| 孟连| 洱源县| 府谷县| 青神县| 竹溪县| 尼玛县| 南雄市| 莒南县| 兴仁县| 津南区| 惠安县| 巫山县| 专栏| 临猗县| 古田县| 宜良县| 舟山市| 阳谷县| 湖南省| 册亨县| 曲水县| 陆丰市| 新泰市| 黄骅市| 宁德市| 和硕县| 蕲春县| 高州市| 陈巴尔虎旗| 海林市| 古交市| 彝良县| 南丰县| 客服| 瑞金市| 遂宁市| 延庆县|