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

?

基于雙排序原理的先進先出數(shù)據(jù)核銷高速通用算法

2021-03-24 09:56王國忠
軟件工程 2021年3期
關(guān)鍵詞:面向?qū)ο?/a>

摘? 要:本文按照軟件中臺的思想,設(shè)計了一個針對先進先出(First-In First-Out, FIFO)[1]數(shù)據(jù)核銷的通用實現(xiàn)框架及其對應(yīng)的入庫數(shù)據(jù)模型、消費數(shù)據(jù)模型和匹配核銷模型。同時,設(shè)計了基于雙排序原理的先進先出數(shù)據(jù)核銷高速實現(xiàn)方法。該方法按照匹配規(guī)則先對數(shù)據(jù)進行排序,然后對兩個有序隊列進行單循環(huán)匹配查找,避免了傳統(tǒng)先進先出實現(xiàn)中的雙循環(huán)操作,可以大幅度提高運算性能,大幅度節(jié)省CPU開銷和存儲開銷,實現(xiàn)超大數(shù)據(jù)量的快速匹配,可以支持兩個億級數(shù)據(jù)庫的快速先進先出匹配。

關(guān)鍵詞:先進先出;存儲過程;雙排序;面向?qū)ο?/p>

中圖分類號:TP31? ? ?文獻標(biāo)識碼:A

Abstract: This paper proposed to design a general implementation framework for FIFO (First-In First-Out) data verification and its corresponding inbound data model, consumption data model and matching verification model based on idea of middle platform. At the same time, a high-speed realization method of FIFO data verification is designed based on the double sorting principle. This method first sorts data according to matching rules, and then performs a single-loop matching search on the two ordered queues, avoiding double-loop operation in traditional FIFO implementation. The proposed method significantly improves computing performance, and greatly saves CPU and storage overheads. As a result, it is capable of processing super large data volume, and can support fast FIFO matching of two databases with large data volume.

Keywords: First-In First-Out (FIFO); storage procedure; double sort; object-oriented

1? ?引言(Introduction)

先進先出是傳統(tǒng)庫存商品成本核算的一個通用方法,商品銷售先選擇最早采購的商品價格作為銷售商品的庫存成本。目前,國內(nèi)很多企業(yè)對于各類消費數(shù)據(jù)都需要用先進先出的方法進行核算。隨著互聯(lián)網(wǎng)新零售大幅度崛起,消費數(shù)據(jù)從傳統(tǒng)的商品批發(fā)零售擴大到很多場景,例如CRM[2](Customer Relationship Management)的積分核銷[3]就是十分典型的一個應(yīng)用,不同商家的積分產(chǎn)生和使用,需要相互結(jié)算。隨著全渠道零售的興起,各個結(jié)算主體之間也存在先進先出的結(jié)算需求。從軟件實現(xiàn)上來看,數(shù)據(jù)庫先進先出核銷需要解決模塊化和運算高效的技術(shù)難點。先進先出算法的缺陷會使系統(tǒng)運行性能變差,甚至導(dǎo)致系統(tǒng)癱瘓。

為了節(jié)省服務(wù)器的計算時間,需要設(shè)計一個通用的高速核銷引擎,方便應(yīng)用程序直接調(diào)用,大幅度降低普通程序員對出入數(shù)據(jù)核銷實現(xiàn)的門檻。目前數(shù)據(jù)基本上都存儲在數(shù)據(jù)庫中,而程序開發(fā)工具大部分是Java或C語言等,通過JDBC/ODBC和數(shù)據(jù)庫連接讀取和寫入數(shù)據(jù)。由于數(shù)據(jù)庫和開發(fā)工具都具備運算能力,因此先進先出引擎可以利用開發(fā)工具能力,也可以利用數(shù)據(jù)庫能力,以及兩者混合能力來實現(xiàn)。

本文按照軟件中臺的思想,設(shè)計了一個針對先進先出數(shù)據(jù)核銷的通用實現(xiàn)框架及其對應(yīng)的入庫數(shù)據(jù)模型、消費數(shù)據(jù)模型和匹配核銷模型。同時,為了克服傳統(tǒng)先進先出數(shù)據(jù)核銷中的雙循環(huán)操作瓶頸,設(shè)計了基于雙排序原理的先進先出數(shù)據(jù)核銷高速實現(xiàn)方法,通過先排序后先進先出,把先進先出算法從乘法變成加法,實現(xiàn)超高速的計算引擎[4],可以滿足超大數(shù)據(jù)的先進先出需求。

2? ?先進先出通用模型設(shè)計(Design of FIFO general model)

為了實現(xiàn)通用的先進先出引擎,本文設(shè)計了一個先進先出通用實現(xiàn)框架[5]。如圖1所示,該框架包含來源數(shù)據(jù)模型FIFO_in、消費數(shù)據(jù)模型FIFO_out和匹配核銷模型FIFO三個模塊。任何需要使用先進先出算法的系統(tǒng),只要將數(shù)據(jù)按照要求存入兩個出入表,然后調(diào)用先進先出引擎運行,即可得到結(jié)果。

入庫數(shù)據(jù)模型FIFO_in,存儲來源數(shù)據(jù)。例如對于商品,就是采購入庫數(shù)據(jù);對于顧客積分,就是顧客消費產(chǎn)生的積分。為了標(biāo)識來源數(shù)據(jù)唯一性,該表需要加入來源數(shù)據(jù)的唯一主鍵信息,主要字段為:先進先出種類(用于區(qū)分應(yīng)用場景,例如商品出入庫、顧客積分等)、來源數(shù)據(jù)關(guān)鍵詞(一般是入庫單號+商品+日期或產(chǎn)生積分的銷售小票單號+顧客信息+日期)、來源數(shù)據(jù)的數(shù)值(數(shù)量、金額、成本、積分等)、來源數(shù)據(jù)的優(yōu)先級(解決FI的不同場景,例如后進先出,只需要調(diào)整優(yōu)先級即可)、已核銷的數(shù)值(被FO匹配到的數(shù)值)、未被核銷的數(shù)值等。

消費數(shù)據(jù)模型FIFO_out,存儲使用數(shù)據(jù)。對于商品,就是銷售或批發(fā)數(shù)據(jù);對于顧客積分,就是使用積分(包括積分抵現(xiàn)、退貨、積分換券等用掉的積分)。為了標(biāo)識目標(biāo)數(shù)據(jù)唯一性,該表需要加入消費數(shù)據(jù)的唯一主鍵信息,主要字段為:先進先出種類(商品出入庫或積分核銷等場景)、消費數(shù)據(jù)關(guān)鍵詞(一般是銷售單號或積分使用單號,加上產(chǎn)品或顧客信息)、消費數(shù)據(jù)的數(shù)值(數(shù)量、金額、成本、積分等)、消費數(shù)據(jù)的優(yōu)先級(解決哪些數(shù)據(jù)優(yōu)先處理的問題)、已匹配數(shù)據(jù)(已經(jīng)匹配到的數(shù)值)等。

匹配核銷模型FIFO,存儲匹配記錄,即消費數(shù)據(jù)和來源數(shù)據(jù)核銷關(guān)系。這需要通過運行先進先出引擎從FIFO_out循環(huán),逐行從FIFO_in表尋找。FIFO匹配核銷模型主要信息為:先進先出種類、出方關(guān)鍵詞、入方關(guān)鍵詞及核銷數(shù)據(jù)。

3? ?五種先進先出算法(Five FIFO algorithms)

傳統(tǒng)數(shù)據(jù)核銷大部分是單個數(shù)據(jù)發(fā)生后,通過某些條件去尋找來源,這樣實現(xiàn)比較簡單。例如,顧客使用積分抵現(xiàn),由于積分可能是其他商家產(chǎn)生的,這樣就需要針對使用積分找到提供積分的商家銷售單進行結(jié)算。實現(xiàn)單個數(shù)據(jù)尋找算法很簡單,就是找到這個顧客以前的積分記錄,把未核銷的積分按照先進先出原則排序,逐個匹配,將匹配到的記錄存在數(shù)據(jù)庫中,并標(biāo)記已經(jīng)核銷的記錄,防止重復(fù)核銷。然而當(dāng)數(shù)據(jù)數(shù)量非常龐大時,先進先出引擎算法的效率直接決定了整個系統(tǒng)的運算性能,一個有缺陷的先進先出算法會使系統(tǒng)運行性能變差甚至導(dǎo)致系統(tǒng)癱瘓。

傳統(tǒng)的先進先出數(shù)據(jù)核銷采用雙循環(huán)機制,運算量大,不適用于處理大規(guī)模的數(shù)據(jù)。為了解決這個問題,本文設(shè)計了基于雙排序原理的先進先出數(shù)據(jù)核銷高速實現(xiàn)方法。該方法按照匹配規(guī)則先對數(shù)據(jù)進行排序,然后對兩個有序隊列進行單循環(huán)匹配查找,避免了傳統(tǒng)先進先出實現(xiàn)中的雙循環(huán)操作,可以大幅度提高運算性能,節(jié)省CPU開銷和存儲開銷,實現(xiàn)超大數(shù)據(jù)量的快速匹配,可以支持兩個億級數(shù)據(jù)庫的快速先進先出匹配。本節(jié)從先進先出數(shù)據(jù)核銷算法演進的角度,對以下五種算法的原理和優(yōu)缺點進行說明。

(1)軟件對象雙循環(huán)匹配查找:基于面向?qū)ο蟮能浖_發(fā)思想,先將來源數(shù)據(jù)和消費數(shù)據(jù)分別映射成開發(fā)工具環(huán)境的兩個對象,通過應(yīng)用軟件(Java/C#)雙循環(huán)進行匹配查找,然后把結(jié)果寫到數(shù)據(jù)庫中。

(2)軟件調(diào)用數(shù)據(jù)庫命令交互查找匹配:應(yīng)用軟件負(fù)責(zé)寫SQL查找和修改語句,交互式調(diào)用數(shù)據(jù)庫進行查找運算。這個方法中開發(fā)工具不存儲大量數(shù)據(jù),全部利用數(shù)據(jù)庫的存儲和SQL能力,進行循環(huán)調(diào)用。

(3)數(shù)據(jù)庫內(nèi)部雙循環(huán)匹配查找:利用數(shù)據(jù)庫的PL/SQL[6]能力,實現(xiàn)雙循環(huán)匹配查找,不需要非數(shù)據(jù)庫的開發(fā)語言代碼。

(4)開發(fā)語言雙排序單循環(huán)匹配查找:首先通過面向?qū)ο蟮拈_發(fā)語言排序,然后進行排序匹配查找,最后批量寫到數(shù)據(jù)庫中。

(5)數(shù)據(jù)庫排序單循環(huán)匹配查找:通過PL/SQL,利用數(shù)據(jù)庫的排序能力,直接在數(shù)據(jù)中排序快速匹配,不需要應(yīng)用開發(fā)工具反復(fù)調(diào)用數(shù)據(jù)庫計算能力。

3.1? ?方法1:軟件對象雙循環(huán)匹配查找

這是最傳統(tǒng)的面向?qū)ο蟮姆椒ǎ脩?yīng)用開發(fā)工具,例如Java、C++[7]或.net,將來源數(shù)據(jù)和消費數(shù)據(jù)分別映射成開發(fā)工具環(huán)境的兩個對象,然后采用雙循環(huán)方法,對兩個對象進行匹配,最后將匹配結(jié)果存在FIFO對象并刷新FIFO_in和FIFO_out對象的已匹配數(shù)量,把對象保存到數(shù)據(jù)庫的表中,如圖2所示。

上述方法利用開發(fā)工具能力雙循環(huán),總體的計算次數(shù)為:出數(shù)據(jù)記錄×進數(shù)據(jù)記錄,所以,總體運算量比較大,效率很低。其優(yōu)點是方便理解,調(diào)試運維效率高。

3.2? ?方法2:軟件調(diào)用數(shù)據(jù)庫命令交互查找匹配

本方法也是傳統(tǒng)的算法,消費數(shù)據(jù)和來源數(shù)據(jù)不需要映射到對象,通過逐條把數(shù)據(jù)庫消費數(shù)據(jù)讀取到內(nèi)存,然后根據(jù)條件從來源數(shù)據(jù)匹配,匹配到的直接寫入數(shù)據(jù)庫,如圖3所示。這個方法的特點是開發(fā)工具部署的應(yīng)用環(huán)境內(nèi)存消耗很低,存儲全部運用數(shù)據(jù)庫的能力,指示命令都是應(yīng)用程序下達給數(shù)據(jù)庫的。這個方法類似傳統(tǒng)的C/S架構(gòu),客戶端發(fā)命令,數(shù)據(jù)庫運算,并且一次命令對應(yīng)一個匹配運算。

這個方法的優(yōu)點是調(diào)試方便,容易運維;缺點是運行效率很低,應(yīng)用軟件和數(shù)據(jù)庫反復(fù)交互,每次SQL運行都需要編譯,代價比較大。這個算法一般是系統(tǒng)開發(fā)初期使用,成熟后需要升級到方法3。

3.3? ?方法3:數(shù)據(jù)庫內(nèi)部雙循環(huán)匹配查找

本方法是方法2的改進,將開發(fā)工具的循環(huán)代碼通過

PL/SQL[8]翻譯成數(shù)據(jù)庫的存儲過程,在數(shù)據(jù)庫內(nèi)部實現(xiàn)雙循環(huán)匹配查找,如圖4所示。這樣客戶端和數(shù)據(jù)庫只需要交互一次,具體循環(huán)全部在存儲過程中,大幅度減少了網(wǎng)絡(luò)交互的開銷和SQL反復(fù)編譯的代價。

該方法存儲過程的優(yōu)點是運行效率很高,SQL代碼都是預(yù)編譯好的,大幅度節(jié)省了數(shù)據(jù)庫編譯SQL的時間,同時節(jié)省了開發(fā)語言和數(shù)據(jù)庫交互的網(wǎng)絡(luò)時延代價;缺點是出現(xiàn)問題時調(diào)試運維不方便,所以需要等方法2成熟后,再翻譯成存儲過程比較好。

3.4? ?方法4:開發(fā)語言雙排序單循環(huán)匹配查找

前面三個方法的特點是運用內(nèi)外雙循環(huán)的傳統(tǒng)算法,運算量都是消費記錄和來源記錄的乘積,對于數(shù)據(jù)量很大的場景運算非常慢。特別是匹配出現(xiàn)異常,需要重新匹配的時間很長,無法快速高效支撐大型企業(yè)的應(yīng)用,所以理論上只能停留在實驗室,不能投入生產(chǎn)系統(tǒng)。

先進先出本質(zhì)上是兩個大表的匹配,雖然不是Join,實際上可以利用排序Join的思想,將運算量從乘法變成加法,極大提高運算的效率,有力支撐企業(yè)先進先出各種場景的應(yīng)用,包括BI(Business Intelligence)分析需要的先進先出應(yīng)用。

方法4通過開發(fā)語言將數(shù)據(jù)進行排序,然后基于排序后的隊列進行匹配查找,最后將結(jié)果批量寫到數(shù)據(jù)庫。圖5首先將來源和消費兩個大表數(shù)據(jù)映射成開發(fā)工具環(huán)境的兩個對象(類似方法1),然后分別按照匹配規(guī)則排序,變成兩個隊列。后續(xù)匹配算法變成了兩個隊列從頭開始同時向下循環(huán),把雙循環(huán)變成單循環(huán),運算量最大就是兩個隊列記錄數(shù)的總和。

排序是本方法的主要代價,需要利用已有的優(yōu)秀排序算法進行快速排序,這樣才可以將兩個對象按照各自的排序進行單循環(huán)匹配。匹配過程是消費數(shù)據(jù)對象外循環(huán),來源數(shù)據(jù)(進數(shù)據(jù))為內(nèi)循環(huán)。和雙循環(huán)的主要區(qū)別是,這兩個循環(huán)是同步進行的,誰匹配完一個就移到下一個,所以總的循環(huán)次數(shù)是兩個相加。匹配完成后,需要將匹配結(jié)果的對象寫回數(shù)據(jù)庫。

3.5? ?方法5:數(shù)據(jù)庫排序單循環(huán)匹配查找

方法4的缺點是需要將大量的數(shù)據(jù)讀到應(yīng)用服務(wù)器的內(nèi)存,匹配完還需要將大量的匹配數(shù)據(jù)寫回數(shù)據(jù)庫,代價比較大。所以方法5通過PL/SQL將方法4的代碼轉(zhuǎn)換成數(shù)據(jù)庫的存儲過程,利用數(shù)據(jù)庫的排序能力,可以大幅度提高運算性能,實現(xiàn)超大數(shù)據(jù)量的快速匹配,大幅度節(jié)省CPU開銷和存儲開銷。

圖6是數(shù)據(jù)庫排序匹配方法的流程圖,排序只需要數(shù)據(jù)庫建一個索引,每秒可以處理十萬條記錄。然后定義兩個Cursor,分別對應(yīng)消費數(shù)據(jù)和來源數(shù)據(jù),兩個循環(huán)組成單循環(huán),第一個循環(huán)和第二個循環(huán)同時進行匹配,整個計算量最多是兩個表的記錄數(shù)相加,所以可以支持兩個億級數(shù)據(jù)量的快速先進先出匹配。

4? ?結(jié)論(Conclusion)

本文按照軟件中臺的思想,設(shè)計了一個針對先進先出數(shù)據(jù)核銷的通用實現(xiàn)框架及其對應(yīng)的入庫數(shù)據(jù)模型、消費數(shù)據(jù)模型和匹配核銷模型,并對五種先進先出數(shù)據(jù)核銷的實現(xiàn)方法進行了闡述。對于企業(yè)應(yīng)用,大部分采用方法5。先進先出作為企業(yè)級應(yīng)用,模塊化價值比較高,可防止不同應(yīng)用場景重復(fù)開發(fā),造成額外開發(fā)量以及性能潛在的風(fēng)險。不同算法對系統(tǒng)的要求不一樣,效果差異很大。普通程序員很容易使用前面運行效率低的算法,在系統(tǒng)開始運行幾個月后,造成系統(tǒng)癱瘓。對于有一定規(guī)模的企業(yè)應(yīng)用數(shù)據(jù),數(shù)據(jù)庫使用效率是十分重要的。先進先出只是數(shù)據(jù)庫應(yīng)用中比較常用的一種方法,其他人工智能的算法也需要充分利用數(shù)據(jù)庫能力,合理設(shè)計算法。如果超過一個數(shù)據(jù)庫能力,就需要用多個數(shù)據(jù)庫以及大數(shù)據(jù)的方法解決。

參考文獻(References)

[1] 闞運奇.營銷零售行業(yè)先進先出算法設(shè)計[J].無線互聯(lián)科技,2012(12):98.

[2] 李靜.基于數(shù)據(jù)挖掘技術(shù)的電子商務(wù)CRM研究[J].現(xiàn)代電子技術(shù),2015(11):126.

[3] 蔣文書.運用數(shù)據(jù)挖掘技術(shù),精準(zhǔn)把握客戶需求[J].軟件和集成電路,2018(Z1):20.

[4] 侯寧.大數(shù)據(jù)環(huán)境下并行化先進先出成本算法研究[J].軟件導(dǎo)刊,2019,18(06):85.

[5] 許桂平.基于數(shù)據(jù)庫的通用驅(qū)動程序自動編寫算法研究[J].電子設(shè)計工程,2019(15):166-169;174.

[6] CJ Fernandez Candel, J Garcia Molina, FJ Bermudez Ruiz, et al. Developing a model-driven reengineering approach for migrating PL/SQL triggers to Java: A practical experience[J].The Journal of Systems and Software,2019(151):38-64.

[7] 鐘玲玲,劉冬雪,黃小平,等.基于C語言的學(xué)生信息管理系統(tǒng)設(shè)計與實現(xiàn)[J].河南科技學(xué)院學(xué)報(自然科學(xué)版),2019(04): 62-67;78.

[8] 周嵐.Oracle中基于Java的存儲過程[D].合肥:安徽大學(xué),2006.

作者簡介:

王國忠(1971-),男,碩士,講師.研究領(lǐng)域:大型分布式數(shù)據(jù)庫應(yīng)用,企業(yè)級應(yīng)用.

猜你喜歡
面向?qū)ο?/a>
面向?qū)ο蠓椒ㄔ谒罾銹LC編程中應(yīng)用分析
電子測試(2018年22期)2018-12-19
面向?qū)ο蟮挠嬎銠C網(wǎng)絡(luò)設(shè)計軟件系統(tǒng)的開發(fā)
面向?qū)ο蟮臄?shù)據(jù)交換協(xié)議研究與應(yīng)用
面向?qū)ο骔eb開發(fā)編程語言的的評估方法
基于面向?qū)ο蟮腛ffice評測系統(tǒng)的分析
峰叢洼地農(nóng)作物面向?qū)ο笮畔⑻崛∫?guī)則集
基于E-cognition的面向?qū)ο蟮母叻直媛蔬b感圖像分類研究
基于面向?qū)ο蟮能囕v管理軟件的研制與開發(fā)
面向?qū)ο蟮腟oS體系結(jié)構(gòu)建模方法及應(yīng)用
衡南县| 平乐县| 鄂托克旗| 新巴尔虎左旗| 当涂县| 霸州市| 南溪县| 朝阳县| 大理市| 循化| 瓦房店市| 怀安县| 徐汇区| 云霄县| 怀集县| 石棉县| 马龙县| 施甸县| 洱源县| 芒康县| 宁南县| 富宁县| 蓬莱市| 门源| 石阡县| 伊吾县| 山阳县| 阿拉善右旗| 平遥县| 福泉市| 修武县| 正宁县| 济源市| 贵南县| 南漳县| 康马县| 香港| 疏勒县| 泰和县| 浦东新区| 长丰县|