上海銀天下科技有限公司 許文偉
手持設(shè)備中股票軟件數(shù)據(jù)存儲(chǔ)方案的設(shè)計(jì)
上海銀天下科技有限公司 許文偉
就股票軟件而言,它的歷史數(shù)據(jù)有著自身的一些特點(diǎn)。文章通過(guò)對(duì)相關(guān)數(shù)據(jù)的特性,以及線性表與B+樹(shù)兩種方案進(jìn)行分析,發(fā)現(xiàn)兩種存儲(chǔ)方案都符合手持設(shè)備中股票軟件的相關(guān)要求,并從性能和資源方面對(duì)二者的優(yōu)劣進(jìn)行了比較,希望本研究可以作為廣大研究者的參考。
手持設(shè)備;股票軟件;數(shù)據(jù)存儲(chǔ);存儲(chǔ)方案;方案設(shè)計(jì)
在目前的科技影響下,一些手持設(shè)備的出現(xiàn),為人們的工作于生活帶來(lái)相當(dāng)大的便利。比如數(shù)據(jù)圖片、股市信息的接收方面。對(duì)于股票軟件來(lái)說(shuō),對(duì)相關(guān)硬件與運(yùn)行環(huán)境的要求通常會(huì)比較高。文章通過(guò)對(duì)線性表、B+樹(shù)進(jìn)行分析,并在相關(guān)方面做了比較,可以從中得知,在實(shí)際應(yīng)用過(guò)程中,應(yīng)當(dāng)結(jié)合相關(guān)實(shí)際情況來(lái)對(duì)儲(chǔ)存方案進(jìn)行選擇。
在當(dāng)前背景下,證券投資行業(yè)發(fā)展速度較快。對(duì)于這方面數(shù)據(jù)的類型而言,一般分為以下幾種:分時(shí)走勢(shì)、即時(shí)成交、歷史日線、個(gè)股F10資料和財(cái)務(wù)公告等方面的信息。在股票軟件的開(kāi)發(fā)過(guò)程中,如果要使軟件更加完整,不但需要把實(shí)時(shí)的相關(guān)交易行情提供給廣大用戶,還要把一些分析歷史成交數(shù)據(jù)的方法提供給廣大用戶,這樣才能符合用戶的各種需求。
所以,在軟件數(shù)據(jù)中,大概有兩種信息需要完成儲(chǔ)存處理。一種是當(dāng)天的分時(shí)走勢(shì)與實(shí)時(shí)行情方面的信息,還有一種是歷史日線、F10資料、財(cái)務(wù)公告方面的信息。就第一種數(shù)據(jù)的儲(chǔ)存來(lái)講,要想合理地節(jié)約空間,可以選擇字節(jié)流的手段,把它儲(chǔ)存在內(nèi)存里面當(dāng)作刷新方面的處理功能,但只能在短時(shí)周期里進(jìn)行。而第二種數(shù)據(jù)信息則應(yīng)當(dāng)存進(jìn)SD卡里面,它需要進(jìn)行長(zhǎng)時(shí)期的存放。[1]對(duì)于財(cái)務(wù)公告信息、F10資料信息而言,對(duì)其儲(chǔ)存方面的定義相當(dāng)明確,就是存為一些小文件。對(duì)于歷史日線方面的數(shù)據(jù)信息則需要在SD里進(jìn)行儲(chǔ)存,它的內(nèi)容顯得較長(zhǎng),應(yīng)當(dāng)長(zhǎng)期存留。
2.1 線性表存儲(chǔ)分析
2.1.1 線性表的結(jié)構(gòu)分析
對(duì)于線性表來(lái)說(shuō),它是一種較為常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),其結(jié)構(gòu)比較簡(jiǎn)單,順序儲(chǔ)存的結(jié)構(gòu)是在軟件的內(nèi)存里面,建立起可以聯(lián)系儲(chǔ)存的空間。然而,這片空間在大小上有較為嚴(yán)格的要求,它不能夠比順序表所具有的長(zhǎng)度還小。同時(shí),在連續(xù)空間里面,它的第一個(gè)位置應(yīng)當(dāng)儲(chǔ)存線性表里面的首個(gè)元素,第二個(gè)位置儲(chǔ)存第二個(gè)元素,依此類推,直到線性表的中元素儲(chǔ)存完畢為止。
由此可得,在線性表上面,如果兩元素在邏輯關(guān)系方面比較接近,那么他們的物理存儲(chǔ)位置也會(huì)比較接近,這是線性表結(jié)構(gòu)中循序儲(chǔ)存比較明顯的特征。如此一來(lái),根據(jù)這個(gè)特點(diǎn),在相關(guān)的儲(chǔ)存單元里面,對(duì)于每一個(gè)數(shù)據(jù)方面的元素而言,要想將它和初始位置的相對(duì)位置確定下來(lái),就顯得非常容易了。
假如在線性表上,元素是(a1,a2,…,an,),其中,a1是線性表上的第一個(gè)元素,它的內(nèi)存地址是LOC(a1)。在計(jì)算機(jī)了面,每一個(gè)現(xiàn)行表上的元素都會(huì)占有C個(gè)儲(chǔ)存單元。而第i個(gè)遠(yuǎn)的的初始位置LOC(ai)=(i-1)*C+LOC(a1)。在這個(gè)公式里面,n≥ i ≥1。由此可見(jiàn),當(dāng)采用隨機(jī)訪問(wèn)的時(shí)候,可以使用順序表來(lái)完成。對(duì)于它的順序儲(chǔ)存結(jié)構(gòu)而言,就是進(jìn)行隨機(jī)儲(chǔ)存的一種結(jié)構(gòu)。
2.1.2 線性表結(jié)構(gòu)的純出方案分析
對(duì)于日線數(shù)據(jù)信息的儲(chǔ)存而言,它需要在SD卡中進(jìn)行合理保存。在對(duì)這些數(shù)據(jù)信息進(jìn)行讀取的時(shí)候,需要通過(guò)相關(guān)的文件系統(tǒng),對(duì)SD卡進(jìn)行相應(yīng)的操作才能完成。[3]同時(shí),這種情況下的讀寫(xiě)操作,隨機(jī)性比較強(qiáng)。在對(duì)股票歷史相關(guān)的日線數(shù)據(jù)信息進(jìn)行儲(chǔ)存時(shí),可以選擇線性表順序儲(chǔ)存結(jié)構(gòu),這種儲(chǔ)存方式能夠使讀寫(xiě)方面的操作速度更加完善。
在File header的功能方面,它在線性表中起著重要作用,能夠儲(chǔ)存股票代碼的索引表,初始化的值都是零。在股票代碼的儲(chǔ)存數(shù)量方面,如果2048個(gè)就是最大限度,那么,每一個(gè)代碼就需要4byte。如此一來(lái),它的索引表最終需要的儲(chǔ)存空間就是8Kbyte。
在Code Block的功能方面,主要是用來(lái)儲(chǔ)存每個(gè)股票儲(chǔ)存日線數(shù)據(jù)塊的。對(duì)于它儲(chǔ)存的數(shù)據(jù)方面來(lái)說(shuō),應(yīng)該嚴(yán)格執(zhí)行相關(guān)的順序來(lái)進(jìn)行儲(chǔ)存,即股票代碼的索引表的順序。同時(shí),在股票代碼的數(shù)量方面,F(xiàn)ile header同Code Block也是一樣的。如此一來(lái),每一個(gè)數(shù)據(jù)塊同F(xiàn)ile header里面的代碼存在著重要聯(lián)系,它們?cè)诖鎯?chǔ)和邏輯順序方面具備一一反應(yīng)的特點(diǎn)。
在Date Block的功能方面,它是將一支股票特定的某天的日線數(shù)據(jù)信息進(jìn)行儲(chǔ)存,而它的順序就是按照年月日方面的時(shí)間順序來(lái)定的。在時(shí)間限制方面,需要根據(jù)實(shí)際當(dāng)中的需求和相應(yīng)的資源條件來(lái)確定它的范圍大小。在每一個(gè)日線數(shù)據(jù)塊里面,Date Block都是24byte。
而在同一個(gè)股市里面,可能會(huì)出現(xiàn)這樣的情況。那就是有些股票的代碼是一樣的,然而股票卻不是一樣的。[4]在這種類型的日行文件里面,股票的最大數(shù)量是2048個(gè),且時(shí)間方面的最長(zhǎng)范圍是19年(不含雙休)從而,就可以就此將每一個(gè)文件大小計(jì)算出來(lái)。其算法就是260×19×24×2048+2048×4,最終結(jié)果就約等于247nyte。在這種算法面,股票代碼的索引表是前面的8Kbyte。由此可得,在儲(chǔ)存深市和滬市的日線文件時(shí),大概需要占據(jù)的空間是495Mbyte。
2.1.3 標(biāo)志變量列表方面的分析
根據(jù)前文中的內(nèi)容可以得知,在同一天時(shí)間里,日線數(shù)據(jù)可以進(jìn)行循環(huán)滾動(dòng)地發(fā)送。對(duì)于一個(gè)股票來(lái)說(shuō),在同一天時(shí)間里面,它的日線數(shù)據(jù)可以不用刷新。因此,需要每次收到日線數(shù)據(jù)后,應(yīng)當(dāng)先對(duì)日線數(shù)據(jù)進(jìn)行判斷,分析后覺(jué)得有必要再進(jìn)行寫(xiě)入。在這個(gè)列表里面,F(xiàn)ile header和Data flag 在儲(chǔ)存順序方面,表現(xiàn)出來(lái)的是一樣的。這樣一來(lái),就能夠同Code Block形成一一對(duì)應(yīng)了,并用來(lái)標(biāo)志Code Block有沒(méi)有完成當(dāng)天的寫(xiě)操作步驟。另外,每一次進(jìn)入股票軟件時(shí),都需要把列表進(jìn)行復(fù)位,并且全部置零。
2.1.4 讀寫(xiě)方面的原則
只有在終端界面上,用戶查看股票的K線圖時(shí),才有從SD里面把相關(guān)股票全部日線數(shù)據(jù)讀出來(lái)的必要。同時(shí),在這種情況下進(jìn)行的讀取,可以不用進(jìn)行周期刷新。由此可知,讀取數(shù)據(jù)的相關(guān)措施就是:對(duì)于股票代碼而言,需要現(xiàn)在索引表里面找到與之相匹配的代碼位置,并把Code Block相關(guān)的偏移地址給計(jì)算出來(lái),然后按照這個(gè)地址,就可以把全部日線數(shù)據(jù)讀出來(lái)。
對(duì)于寫(xiě)數(shù)據(jù)來(lái)說(shuō),需要現(xiàn)將相關(guān)的日線數(shù)據(jù)解析出來(lái)以后,再進(jìn)行這個(gè)步驟。并且把相關(guān)數(shù)據(jù)信息儲(chǔ)存到SD卡里面。對(duì)于股票的日線數(shù)據(jù)而言,凡是支持的數(shù)據(jù)都要進(jìn)行保存,這使得數(shù)據(jù)量非常龐大。應(yīng)當(dāng)對(duì)這些數(shù)據(jù)進(jìn)行一定的優(yōu)化操作,從而使寫(xiě)操作不會(huì)那么頻繁。其措施主要是,將一個(gè)寫(xiě)循環(huán)緩沖定義到內(nèi)存,如果緩沖區(qū)域已經(jīng)被日線數(shù)據(jù)占據(jù),并在對(duì)另一支股票的日線數(shù)據(jù)進(jìn)行接收操作時(shí),就需要依靠該列表的作用,判斷這支股票的日線數(shù)據(jù)有沒(méi)有寫(xiě)進(jìn)去。[5]如果沒(méi)有完成,就需要進(jìn)行寫(xiě)操作,并在列表里面把data fl ag置位,并標(biāo)注清楚,不然的話,緩沖區(qū)就會(huì)被新的數(shù)據(jù)所覆蓋。
2.2 B+樹(shù)結(jié)構(gòu)存儲(chǔ)分析
2.2.1 B+樹(shù)的原理分析
對(duì)于B+樹(shù)結(jié)構(gòu)來(lái)說(shuō),其實(shí)就是從B樹(shù)變化而來(lái),在查找方面,與B樹(shù)有很多相似的地方。在業(yè)界店里面,儲(chǔ)存著與記錄相關(guān)的數(shù)據(jù)信息。在查找過(guò)程中,如果待查關(guān)鍵碼在上層發(fā)現(xiàn),且不停下,可向下將葉節(jié)點(diǎn)層關(guān)鍵碼找到。除此之外,葉節(jié)點(diǎn)能夠組成有序鏈表,能夠根據(jù)關(guān)鍵碼的次序來(lái)遍歷所有的記錄。由此可得,在范圍搜索方面,B+樹(shù)顯得較為合適。并且,它的實(shí)際應(yīng)用很多,如隨機(jī)和順序檢索等。
2.2.2 存儲(chǔ)方案分析
在SD卡里面,可以分配一個(gè)“/stock”的專用目錄,對(duì)股票的數(shù)據(jù)進(jìn)行儲(chǔ)存。如果是財(cái)務(wù)相關(guān)的公告,或者是F10的資料,可以根據(jù)各自的文件名稱,儲(chǔ)存這個(gè)目錄下面。但是,在SD卡中,其日線數(shù)據(jù)就會(huì)組織為2個(gè)文件了。即數(shù)據(jù)記錄文件和索引文件,同時(shí),SD卡中的文件系統(tǒng)可以被確認(rèn)成FAT16。磁盤(pán)空間被FAT劃分開(kāi)來(lái),并將簇當(dāng)作是單位。[6]對(duì)于一個(gè)磁盤(pán)簇長(zhǎng)度而言,它相當(dāng)于512byte。對(duì)于索引文件內(nèi)容來(lái)講,通過(guò)B+樹(shù)的索引,相應(yīng)的數(shù)據(jù)記錄信息儲(chǔ)存到數(shù)據(jù)文件里面,并且應(yīng)4byte對(duì)齊。
在數(shù)據(jù)文件里面,相關(guān)的組織方式根據(jù)定長(zhǎng)記錄來(lái)決定,每一條記錄和日線數(shù)據(jù)項(xiàng)都要形成對(duì)應(yīng)關(guān)系。針對(duì)于日線數(shù)據(jù)來(lái)講,它缺少刪除節(jié)點(diǎn)的選項(xiàng),儲(chǔ)存是依靠一點(diǎn)點(diǎn)積累起來(lái)的。但它具備更新與插入選項(xiàng),這樣,進(jìn)行也快管理的時(shí)候就方便多了。對(duì)于管理也快非配的對(duì)來(lái)說(shuō),并不要求去進(jìn)行維護(hù),只需要把遞增值記錄下來(lái)就行了。
在日線數(shù)據(jù)的相關(guān)文件里面,頭部位置空出一個(gè)記錄的長(zhǎng)度來(lái),以便可以對(duì)個(gè)數(shù)等信息和標(biāo)志進(jìn)行記錄。
對(duì)于索引指針來(lái)說(shuō),它的長(zhǎng)度一般為4byte。在長(zhǎng)度方面,它完全符合相關(guān)要求。它可以對(duì)4G個(gè)單元進(jìn)行索引。通俗一點(diǎn)的說(shuō)法為,數(shù)據(jù)項(xiàng)大致約為數(shù)百年,所以從長(zhǎng)度方面來(lái)看完全不用擔(dān)心。
如果葉節(jié)點(diǎn)的扇出系數(shù)假設(shè)成56,不是葉節(jié)點(diǎn)的是57,將滬深股市2046支股票進(jìn)行計(jì)算,大約能夠有四層B+樹(shù),差不多可以儲(chǔ)存19年的日線數(shù)據(jù)占據(jù)的空間大概是330Mbyte。就四層樹(shù)來(lái)說(shuō),如果要得到查詢的結(jié)果,執(zhí)行不超過(guò)五次的讀操作就能夠?qū)崿F(xiàn)了。[7]針對(duì)于索引文件時(shí),一般都為整個(gè)節(jié)點(diǎn)快方面的操作。如果是單個(gè)操作的話,所涉及到的節(jié)點(diǎn)最多不會(huì)超過(guò)三個(gè)。
綜上所述,對(duì)于手持設(shè)備這種股票軟件的應(yīng)用要求而言,上述方案均能夠滿足,只是二者相比之下,各有優(yōu)勢(shì)和劣勢(shì),主要表現(xiàn)在各自的性能發(fā)揮和資源的損耗方面。首先,在時(shí)間方面,經(jīng)過(guò)實(shí)踐驗(yàn)證,將22天日線數(shù)據(jù)寫(xiě)入,其大小差不多是528byte,如果使用線性表來(lái)進(jìn)行操作,時(shí)間大概為9秒,B+樹(shù)則遠(yuǎn)遠(yuǎn)低于先形變的方案,只要十來(lái)毫秒就可以完成。其次,在空間的占用方面,條件一樣的情形下,線性表為495Mbyte,B+樹(shù)要少得多,只需要330Mbyte。但是,在實(shí)際的應(yīng)用過(guò)程中,應(yīng)當(dāng)從股票軟件等方面的具體情況出發(fā),選擇于實(shí)際更相吻合的方案來(lái)進(jìn)行操作。
[1]劉井蓮,趙衛(wèi)績(jī),文海霞.基于關(guān)聯(lián)規(guī)則的股票分析軟件的設(shè)計(jì)與實(shí)現(xiàn)[J].通化師范學(xué)院學(xué)報(bào),2012,08:30-32.
[2]悠蘭.自信滿滿做一生的贏家——對(duì)話漢諾威環(huán)球財(cái)富有限公司創(chuàng)始人、股票交易算法軟件的研發(fā)者易革新[J].中國(guó)高新區(qū),2015,05:66-67.
[3]祁建宏,達(dá)文姣.線性表成組鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)研究[J].制造業(yè)自動(dòng)化,2017,02:104-105+119.
[4]耿慶田,狄婧,常亮,趙宏偉.基于B+樹(shù)的數(shù)據(jù)索引存儲(chǔ)[J].吉林大學(xué)學(xué)報(bào)(理學(xué)版),2013,06:1133-1136.
[5]長(zhǎng)孫妮妮,張毅坤,華燈鑫,鄒子夏,陳浩.一種基于B+樹(shù)的混合索引結(jié)構(gòu)[J].計(jì)算機(jī)工程,2012,14:35-37+40.
[6]梁俊杰,肖瑤,余敦輝.MapReduce框架下基于B+樹(shù)的高維索引[J].計(jì)算機(jī)應(yīng)用研究,2016,03:706-710+715.
[7]楊萬(wàn)清,戚欣革,欒敬釗,李振威,姜學(xué)樸.電力大數(shù)據(jù)存儲(chǔ)方案設(shè)計(jì)[J].東北電力技術(shù),2015,12:41-43.