本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,更具體地,涉及一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法及裝置。
背景技術(shù):
計(jì)算機(jī)程序開(kāi)發(fā)中經(jīng)常會(huì)用到數(shù)據(jù)集合,數(shù)據(jù)可能很大,需要數(shù)據(jù)以線性存儲(chǔ),能夠快速的插入數(shù)據(jù),并能根據(jù)索引快速獲取數(shù)據(jù),不要?jiǎng)h除。例如性能統(tǒng)計(jì)中需要不停的記錄采樣得到的數(shù)據(jù),數(shù)據(jù)不停的存儲(chǔ),同時(shí)需要根據(jù)索引順序快速獲取對(duì)應(yīng)的數(shù)據(jù)。
目前,各種開(kāi)發(fā)包提供的數(shù)組集合是一種動(dòng)態(tài)數(shù)組,以數(shù)組實(shí)現(xiàn),長(zhǎng)度不夠時(shí),會(huì)自動(dòng)擴(kuò)展數(shù)組長(zhǎng)度形成一個(gè)新的長(zhǎng)度更大的數(shù)組,然后拷貝當(dāng)前存儲(chǔ)數(shù)組數(shù)據(jù)到該新的長(zhǎng)度更大的數(shù)組。當(dāng)數(shù)據(jù)量很大時(shí),添加或刪除數(shù)據(jù)頻繁時(shí),數(shù)組的自動(dòng)擴(kuò)展會(huì)非常耗時(shí),會(huì)導(dǎo)致系統(tǒng)性能下降,效率很低。鏈表集合是以鏈表結(jié)構(gòu)實(shí)現(xiàn),當(dāng)數(shù)據(jù)量很大時(shí),增刪較快,但獲取較慢。
因此,現(xiàn)有的程序開(kāi)發(fā)包中的數(shù)組或鏈表都不能很好的滿足實(shí)際要求。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種克服上述問(wèn)題或者至少部分地解決上述問(wèn)題的數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法及裝置。
根據(jù)本發(fā)明的一個(gè)方面,提供一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法,包括:
s1,當(dāng)進(jìn)行數(shù)據(jù)添加時(shí),獲取當(dāng)前存儲(chǔ)數(shù)組,所述當(dāng)前存儲(chǔ)數(shù)組的長(zhǎng)度為固定長(zhǎng)度;檢測(cè)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間是否已滿;
s2,當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間未滿時(shí),向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù);或者
當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間已滿時(shí),創(chuàng)建新存儲(chǔ)數(shù)組為當(dāng)前存儲(chǔ)數(shù)組,向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù),并將所述新存儲(chǔ)數(shù)組添加到數(shù)據(jù)存儲(chǔ)總數(shù)組中。
根據(jù)本發(fā)明的一個(gè)方面,還提供一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)裝置,包括:
存儲(chǔ)空間檢測(cè)模塊,用于當(dāng)進(jìn)行數(shù)據(jù)添加時(shí),獲取當(dāng)前存儲(chǔ)數(shù)組,所述當(dāng)前存儲(chǔ)數(shù)組的長(zhǎng)度為固定長(zhǎng)度;檢測(cè)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間是否已滿;
數(shù)據(jù)存儲(chǔ)模塊,用于當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間未滿時(shí),向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù);或者
當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間已滿時(shí),創(chuàng)建新存儲(chǔ)數(shù)組為當(dāng)前存儲(chǔ)數(shù)組,向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù),并將所述新存儲(chǔ)數(shù)組添加到數(shù)據(jù)存儲(chǔ)總數(shù)組中。
本發(fā)明提出一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法及裝置,通過(guò)當(dāng)前存儲(chǔ)數(shù)組和數(shù)據(jù)存儲(chǔ)總數(shù)組實(shí)現(xiàn)了嵌套數(shù)組,所述當(dāng)前存儲(chǔ)數(shù)組為固定長(zhǎng)度的數(shù)組,不需要進(jìn)行動(dòng)態(tài)擴(kuò)展;因而在所述數(shù)據(jù)存儲(chǔ)總數(shù)組的一個(gè)元素中即可存儲(chǔ)大量數(shù)據(jù),從而降低了所述數(shù)據(jù)存儲(chǔ)總數(shù)組的容量增長(zhǎng)速度,降低了數(shù)組動(dòng)態(tài)擴(kuò)展時(shí)的性能消耗;增加大量數(shù)據(jù)進(jìn)行存儲(chǔ)時(shí)只會(huì)增加存儲(chǔ)數(shù)組,每個(gè)存儲(chǔ)數(shù)組依然可以快速的添加數(shù)據(jù),并不會(huì)因?yàn)閿?shù)組集合過(guò)大導(dǎo)致效率降低。
附圖說(shuō)明
圖1為本發(fā)明實(shí)施例一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法流程圖;
圖2為本發(fā)明實(shí)施例一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法的設(shè)備的結(jié)構(gòu)框圖示意圖。
具體實(shí)施方式
下面結(jié)合附圖和實(shí)施例,對(duì)本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)描述。以下實(shí)施例用于說(shuō)明本發(fā)明,但不用來(lái)限制本發(fā)明的范圍。
如圖1所示,一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法,包括:
s1,當(dāng)進(jìn)行數(shù)據(jù)添加時(shí),獲取當(dāng)前存儲(chǔ)數(shù)組,所述當(dāng)前存儲(chǔ)數(shù)組的長(zhǎng)度為固定長(zhǎng)度;檢測(cè)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間是否已滿;
s2,當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間未滿時(shí),向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù);或者
當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間已滿時(shí),創(chuàng)建新存儲(chǔ)數(shù)組為當(dāng)前存儲(chǔ)數(shù)組,向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù),并將所述新存儲(chǔ)數(shù)組添加到數(shù)據(jù)存儲(chǔ)總數(shù)組中。
本實(shí)施例一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法,通過(guò)當(dāng)前存儲(chǔ)數(shù)組和數(shù)據(jù)存儲(chǔ)總數(shù)組實(shí)現(xiàn)了嵌套數(shù)組,所述當(dāng)前存儲(chǔ)數(shù)組為固定長(zhǎng)度的數(shù)組,不需要進(jìn)行動(dòng)態(tài)擴(kuò)展;因而在所述數(shù)據(jù)存儲(chǔ)總數(shù)組的一個(gè)元素中即可存儲(chǔ)大量數(shù)據(jù),從而降低了所述數(shù)據(jù)存儲(chǔ)總數(shù)組的容量增長(zhǎng)速度,降低了數(shù)組動(dòng)態(tài)擴(kuò)展時(shí)的性能消耗;增加大量數(shù)據(jù)進(jìn)行存儲(chǔ)時(shí)只會(huì)增加存儲(chǔ)數(shù)組,每個(gè)存儲(chǔ)數(shù)組依然可以快速的添加數(shù)據(jù),并不會(huì)因?yàn)閿?shù)組集合過(guò)大導(dǎo)致效率降低。
在一個(gè)實(shí)施例中,所述s1之前還包括:
s0,創(chuàng)建所述數(shù)據(jù)存儲(chǔ)總數(shù)組,所述數(shù)據(jù)存儲(chǔ)總數(shù)組的類(lèi)型為數(shù)組類(lèi)型,所述數(shù)據(jù)存儲(chǔ)總數(shù)組中的元素為存儲(chǔ)數(shù)組,所述存儲(chǔ)數(shù)組的類(lèi)型為所述數(shù)組類(lèi)型,設(shè)置所述存儲(chǔ)數(shù)組的長(zhǎng)度為固定長(zhǎng)度。
本實(shí)施例創(chuàng)建了嵌套數(shù)組的數(shù)據(jù)存儲(chǔ)總數(shù)組,所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)組類(lèi)型為默認(rèn)動(dòng)態(tài)增長(zhǎng)的數(shù)組。當(dāng)數(shù)據(jù)量很大時(shí),由于所述數(shù)據(jù)存儲(chǔ)總數(shù)組的每一個(gè)元素仍然為一個(gè)數(shù)組類(lèi)型的存儲(chǔ)數(shù)組,該存儲(chǔ)數(shù)組默認(rèn)也是動(dòng)態(tài)增長(zhǎng)的,但是由于本實(shí)施例已經(jīng)在定義時(shí)設(shè)置所述存儲(chǔ)數(shù)組的長(zhǎng)度為固定長(zhǎng)度,因而所述數(shù)據(jù)存儲(chǔ)總數(shù)組內(nèi)的每一個(gè)存儲(chǔ)數(shù)組均為固定長(zhǎng)度的數(shù)組,每一個(gè)存儲(chǔ)數(shù)組存儲(chǔ)空間不會(huì)發(fā)生變化。
由于所述數(shù)據(jù)存儲(chǔ)總數(shù)組的每個(gè)元素都是一個(gè)數(shù)組,因而在所述數(shù)據(jù)存儲(chǔ)總數(shù)組的一個(gè)元素中即可存儲(chǔ)大量數(shù)據(jù),從而降低了所述數(shù)據(jù)存儲(chǔ)總數(shù)組的容量增長(zhǎng)速度,降低了數(shù)組動(dòng)態(tài)擴(kuò)展時(shí)的性能消耗;設(shè)置所述數(shù)據(jù)存儲(chǔ)總數(shù)組的每一個(gè)元素為固定長(zhǎng)度的數(shù)組,不需要進(jìn)行動(dòng)態(tài)擴(kuò)展;當(dāng)一個(gè)存儲(chǔ)數(shù)組的存儲(chǔ)空間滿了,就會(huì)新建一個(gè)相同長(zhǎng)度的存儲(chǔ)數(shù)組,由于這個(gè)存儲(chǔ)數(shù)組的長(zhǎng)度是預(yù)先設(shè)置的,因而使用時(shí)不會(huì)動(dòng)態(tài)增加,進(jìn)一步降低了性能消耗。
在一個(gè)實(shí)施例中,所述一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法還包括:
s3,基于數(shù)據(jù)索引,從所述數(shù)據(jù)存儲(chǔ)總數(shù)組中獲取所述數(shù)據(jù)索引對(duì)應(yīng)的特定存儲(chǔ)數(shù)組,在所述特定存儲(chǔ)數(shù)組中獲取所述數(shù)據(jù)索引對(duì)應(yīng)的數(shù)據(jù)。
本實(shí)施例是數(shù)據(jù)的獲取,分兩步:根據(jù)所述數(shù)據(jù)索引,先從所述數(shù)據(jù)存儲(chǔ)總數(shù)組中獲取特定存儲(chǔ)數(shù)組;再所述特定存儲(chǔ)數(shù)組中獲取所述數(shù)據(jù)索引對(duì)應(yīng)的數(shù)據(jù)。本實(shí)施例通過(guò)數(shù)據(jù)索引在嵌套的數(shù)組中獲取對(duì)應(yīng)數(shù)據(jù),比起非嵌套的、直接存儲(chǔ)數(shù)據(jù)的數(shù)組的數(shù)據(jù)檢索效率更高;當(dāng)大數(shù)據(jù)量時(shí),仍然可以快速高效的獲取數(shù)據(jù)。
本實(shí)施例中,所述s3和s1、s2之間并沒(méi)有必然的順序關(guān)系。所述s1和s2是描述數(shù)據(jù)的存儲(chǔ),s3是描述數(shù)據(jù)的獲取,由于數(shù)據(jù)的存儲(chǔ)是持續(xù)發(fā)生的,數(shù)據(jù)的獲取也是是持續(xù)發(fā)生的,而數(shù)據(jù)的存儲(chǔ)和數(shù)據(jù)的獲取經(jīng)常是交叉發(fā)生的,因此所述s3和s1、s2之間也是交叉進(jìn)行的。
在一個(gè)實(shí)施例中,s1中所述檢測(cè)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間是否已滿包括:
獲取所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)據(jù)總數(shù),將所述數(shù)據(jù)總數(shù)與所述固定長(zhǎng)度的模運(yùn)算,獲取第一模值;
當(dāng)所述第一模值為0時(shí),檢測(cè)結(jié)果為所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間已滿,否則檢測(cè)結(jié)果為所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間未滿。
本實(shí)施提供了一種檢測(cè)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間是否已滿的方法,通過(guò)所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)據(jù)總數(shù)和每個(gè)存儲(chǔ)數(shù)組的固定長(zhǎng)度即可進(jìn)行檢測(cè)判斷。
本實(shí)施例所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)據(jù)總數(shù),是指數(shù)據(jù)存儲(chǔ)總數(shù)組的每一個(gè)存儲(chǔ)數(shù)組所存儲(chǔ)的數(shù)據(jù)的數(shù)目之和。
本實(shí)施例具體方法是:
假設(shè)固定長(zhǎng)度為capacity=4096,當(dāng)前數(shù)據(jù)總數(shù)為size=8192,則所述模運(yùn)算為:local=size%capacity=8192%4096=0,則模值local為0,當(dāng)前存儲(chǔ)數(shù)組已滿;則創(chuàng)建一個(gè)新存儲(chǔ)數(shù)組,所述新存儲(chǔ)數(shù)組的長(zhǎng)度依然是固定長(zhǎng)度,在本例中固定長(zhǎng)度為4096,將待存儲(chǔ)數(shù)據(jù)寫(xiě)入新存儲(chǔ)數(shù)組。
假設(shè)所述固定長(zhǎng)度為capacity=4096,當(dāng)前數(shù)據(jù)總數(shù)為size=8158,則所述模運(yùn)算為:local=size%capacity=8158%4096=4062,則模值local不為0,當(dāng)前存儲(chǔ)數(shù)組還有存儲(chǔ)空間,則直接將待存儲(chǔ)數(shù)據(jù)寫(xiě)入當(dāng)前存儲(chǔ)數(shù)組。
在一個(gè)實(shí)施例中,所述s2還包括:向所述當(dāng)前存儲(chǔ)數(shù)組或者所述新存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù)后,將所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)據(jù)總數(shù)加1。
本實(shí)施例中,不管待存儲(chǔ)數(shù)據(jù)是存入當(dāng)前存儲(chǔ)數(shù)組,還是存儲(chǔ)新存儲(chǔ)數(shù)組,總的存儲(chǔ)數(shù)目增加一個(gè),則將所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)據(jù)總數(shù)加1,使存儲(chǔ)數(shù)組的相關(guān)數(shù)據(jù)都保持一個(gè)動(dòng)態(tài)同步,以便后續(xù)使用。
在一個(gè)實(shí)施例中,所述s3進(jìn)一步包括:
s3.1,將所述數(shù)據(jù)索引與所述固定長(zhǎng)度進(jìn)行除運(yùn)算,獲取整數(shù)值;
s3.2,以所述整數(shù)值為存儲(chǔ)數(shù)組索引,在所述數(shù)據(jù)存儲(chǔ)總數(shù)組中獲取特定存儲(chǔ)數(shù)組;
s3.3,將所述數(shù)據(jù)索引與所述固定長(zhǎng)度進(jìn)行模運(yùn)算,獲取第二模值;
s3.4,以所述第二模值為當(dāng)前索引,在所述特定存儲(chǔ)數(shù)組獲取所述數(shù)據(jù)索引對(duì)應(yīng)的數(shù)據(jù)。
本實(shí)施例具體披露了如何在嵌套的數(shù)組中獲取數(shù)據(jù)。所述數(shù)據(jù)索引是指所述數(shù)據(jù)存儲(chǔ)總數(shù)組的全局?jǐn)?shù)據(jù)索引,在數(shù)據(jù)存儲(chǔ)時(shí),按照每個(gè)數(shù)據(jù)存儲(chǔ)的先后順序而給予一個(gè)索引,作為每個(gè)數(shù)據(jù)在所述數(shù)據(jù)存儲(chǔ)總數(shù)組中的唯一索引。
本實(shí)施例中,假設(shè)所述數(shù)據(jù)索引index=10218,所述固定長(zhǎng)度為capacity=4096,則所述除運(yùn)算為:
seq=index/capacity=10218/4096=2,seq即為存儲(chǔ)數(shù)組索引,在所述數(shù)據(jù)存儲(chǔ)總數(shù)組中獲取索引為2的特定存儲(chǔ)數(shù)組。
然后進(jìn)行模運(yùn)算,及l(fā)ocal=index%capacity=10218%4096=2026,所述local即為當(dāng)前索引,在所述特定存儲(chǔ)數(shù)組獲取索引為2026的數(shù)據(jù)。
在一個(gè)實(shí)施例中,所述s1之前還包括獲取讀寫(xiě)鎖,所述s2之后還包括釋放所述讀寫(xiě)鎖;所述讀寫(xiě)鎖,用于對(duì)所述數(shù)據(jù)存儲(chǔ)總數(shù)組及當(dāng)前存儲(chǔ)數(shù)組進(jìn)行寫(xiě)保護(hù)。
本實(shí)施例對(duì)所述數(shù)據(jù)存儲(chǔ)總數(shù)組及當(dāng)前存儲(chǔ)數(shù)組進(jìn)行寫(xiě)鎖保護(hù),當(dāng)獲取讀寫(xiě)鎖后,其他線程無(wú)法對(duì)所述數(shù)據(jù)存儲(chǔ)總數(shù)組及當(dāng)前存儲(chǔ)數(shù)組進(jìn)行寫(xiě)操作,只有當(dāng)讀寫(xiě)鎖釋放后,其他線程才能對(duì)所述數(shù)據(jù)存儲(chǔ)總數(shù)組及當(dāng)前存儲(chǔ)數(shù)組進(jìn)行寫(xiě)操作,可以避免不同線程對(duì)存儲(chǔ)數(shù)組進(jìn)行寫(xiě)入而發(fā)生異常。
在一個(gè)實(shí)施例中,所述s3.1之前還包括:當(dāng)所述數(shù)據(jù)索引大于所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)據(jù)總數(shù)時(shí),返回空數(shù)據(jù)。
本實(shí)施例,在獲取數(shù)據(jù)前,首先判斷所述數(shù)據(jù)索引是否大于所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)據(jù)總數(shù),若大于,則超出了存儲(chǔ)數(shù)組的存儲(chǔ)范圍,此時(shí)無(wú)法獲取數(shù)據(jù),直接返回空數(shù)據(jù)。在進(jìn)行上述判斷之后,當(dāng)所述數(shù)據(jù)索引小于所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)據(jù)總數(shù)時(shí),才進(jìn)行步驟s3.1-s3.4。
在一個(gè)實(shí)施例中,所述一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法還包括:
s4,當(dāng)刪除所存儲(chǔ)的數(shù)據(jù)時(shí),遍歷所述數(shù)據(jù)存儲(chǔ)總數(shù)組,清空所述數(shù)據(jù)存儲(chǔ)總數(shù)組中的每一個(gè)存儲(chǔ)數(shù)組中的數(shù)據(jù),并清空所述數(shù)據(jù)存儲(chǔ)總數(shù)組中的存儲(chǔ)數(shù)組,將所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)據(jù)總數(shù)設(shè)置為0。
本實(shí)施例中,當(dāng)存儲(chǔ)的數(shù)據(jù)量過(guò)大,需要清理所存儲(chǔ)的數(shù)據(jù)時(shí),或者當(dāng)所存儲(chǔ)的數(shù)據(jù)無(wú)用時(shí),或者其他任何清理數(shù)據(jù)的需要,都可以執(zhí)行所述步驟s4,以滿足實(shí)際應(yīng)用的需要。
同樣,本實(shí)施例中由于所述數(shù)據(jù)存儲(chǔ)總數(shù)組為嵌套的數(shù)組,清理數(shù)據(jù)時(shí),比非嵌套數(shù)組效率更高,在清理大數(shù)據(jù)量時(shí)不會(huì)造成系統(tǒng)擁塞。
本實(shí)施例中所述s4與s1、s2和s3之間也沒(méi)有必然的先后順序,數(shù)據(jù)的存儲(chǔ)、獲取和清理在應(yīng)用程序的實(shí)際運(yùn)行過(guò)程中都是交叉發(fā)生的,因此執(zhí)行數(shù)據(jù)的存儲(chǔ)、獲取和清理的步驟也是交叉進(jìn)行。
在一個(gè)實(shí)施例中,所述s4之前還包括獲取所述讀寫(xiě)鎖,所述s4之后還包括釋放所述讀寫(xiě)鎖。
本實(shí)施例中,對(duì)數(shù)據(jù)的清理屬于寫(xiě)操作,同樣使用讀寫(xiě)鎖對(duì)寫(xiě)操作進(jìn)行保護(hù),以避免寫(xiě)入和清理同時(shí)發(fā)生而造成數(shù)據(jù)丟失。
下面通過(guò)java程序,及java開(kāi)發(fā)包所提供的arraylist數(shù)組類(lèi)型來(lái)具體描述本發(fā)明實(shí)施例方案。具體包括:
(1)創(chuàng)建嵌套數(shù)組
定義int類(lèi)型靜態(tài)常量capacity=4096,表示單個(gè)存儲(chǔ)列表的長(zhǎng)度,4096為2的12次方,方便位移計(jì)算,int為java中整數(shù)類(lèi)型變量。
定義arraylist<arraylist>類(lèi)型成員變量arrayset,表示arrayset為arraylist動(dòng)態(tài)數(shù)組,其中存儲(chǔ)的數(shù)據(jù)也是arraylist動(dòng)態(tài)數(shù)組,即數(shù)據(jù)分桶。定義arraylist類(lèi)型成員變量curarray,表示當(dāng)前正在添加的動(dòng)態(tài)數(shù)組,即當(dāng)前桶。
定義int類(lèi)型成員變量size,表示數(shù)組arrayset中存儲(chǔ)的數(shù)據(jù)的總數(shù)。
定義readwritelock類(lèi)型成員變量lock,readwritelock為java中讀寫(xiě)鎖,在多線程操作是可對(duì)數(shù)據(jù)進(jìn)行讀或?qū)懙淖x寫(xiě)鎖。
所述成員變量arrayset即所述數(shù)據(jù)存儲(chǔ)總數(shù)組,所述成員變量curarray即當(dāng)前存儲(chǔ)數(shù)組。
(2)數(shù)據(jù)的存儲(chǔ)
向當(dāng)前存儲(chǔ)數(shù)組添加數(shù)據(jù)前,調(diào)用lock.writelock().lock()對(duì)數(shù)據(jù)進(jìn)行寫(xiě)的讀寫(xiě)鎖,表示在未調(diào)用lock.writelock().unlock()釋放寫(xiě)的讀寫(xiě)鎖之前,其他線程無(wú)法寫(xiě)入直到釋放鎖后才能寫(xiě)入。
計(jì)算當(dāng)前桶curarray是否裝滿,若裝滿則增加新桶并將數(shù)據(jù)添加到新桶中,若未裝滿則將數(shù)據(jù)添加到當(dāng)前桶中,通過(guò)計(jì)算local=size%capacity,集合總大小除以單個(gè)桶容量取余獲取。
若local為0,則表示已有的數(shù)據(jù)正好裝滿已有的桶中,已有的每個(gè)桶都已裝滿。添加的數(shù)據(jù)需要添加到新桶中。調(diào)用curarray=newarraylist(capacity),新建arraylist設(shè)置桶大小并賦值給當(dāng)前桶curarray;調(diào)用curarray.add(data)將數(shù)據(jù)添加到當(dāng)前桶curarray中,其中data為要添加的數(shù)據(jù);調(diào)用arrayset.add(curarray)將當(dāng)前桶添加到數(shù)據(jù)分桶arrayset中。
若local不等0,則表示已有數(shù)據(jù)沒(méi)有裝滿已有的桶中,當(dāng)前桶curarray沒(méi)有裝滿。直接調(diào)用curarray.add(data)將數(shù)據(jù)添加到當(dāng)前桶curarray中,其中data為要添加的數(shù)據(jù)。
調(diào)用size++,對(duì)數(shù)組中存儲(chǔ)數(shù)據(jù)的總數(shù)加1。
最后調(diào)用lock.writelock().unlock()釋放寫(xiě)的讀寫(xiě)鎖,添加數(shù)據(jù)完成。
本實(shí)施例實(shí)現(xiàn)了數(shù)據(jù)的添加,并通過(guò)寫(xiě)的讀寫(xiě)鎖實(shí)現(xiàn)了線程同步。新建arraylist桶設(shè)置了桶的大小為capacity即4096,并通過(guò)分桶的方式解決了arraylist動(dòng)態(tài)數(shù)組添加數(shù)據(jù)超過(guò)容量時(shí)頻繁調(diào)用arrays.copyof方法拷貝數(shù)組導(dǎo)致性能下降的問(wèn)題。通過(guò)指定每個(gè)桶的大小,使arraylist不會(huì)動(dòng)態(tài)擴(kuò)容,不會(huì)調(diào)用arrays.copyof拷貝數(shù)組,當(dāng)數(shù)據(jù)超過(guò)單桶容量時(shí),新增桶存儲(chǔ)數(shù)據(jù)。增加大量數(shù)據(jù)時(shí)只會(huì)增加分桶,每個(gè)分桶的增加依然可以快速的添加,并不會(huì)因?yàn)閿?shù)組集合過(guò)大導(dǎo)致效率降低。
(3)數(shù)據(jù)的獲取
通過(guò)指定索引位置index快速獲取對(duì)應(yīng)的數(shù)據(jù)。
判斷index是否大于數(shù)組arrayset中存儲(chǔ)的數(shù)據(jù)總數(shù)size,若index大于size,則索引值超過(guò)size大小,不再集合中,直接返回空數(shù)據(jù)。
若index小于等于數(shù)組arrayset中存儲(chǔ)的數(shù)據(jù)總數(shù)size,則索引值在arrayset大小內(nèi)。
計(jì)算seq=index/capacity獲取索引index在分桶arrayset的序號(hào),即在哪個(gè)分桶中,索引index除以分桶容量capacity取整的值即為分桶序號(hào)seq。
計(jì)算local=index%capacity獲取索引index在桶中的位置,即在具體桶的第幾個(gè),索引index除以分桶容量capacity取余的值即為在桶中的位置local。
通過(guò)調(diào)用arrayset.get(seq).get(local)獲取索引index對(duì)應(yīng)的數(shù)據(jù)。即根據(jù)計(jì)算的分桶序號(hào)seq從數(shù)據(jù)分桶集合arrayset中獲取對(duì)應(yīng)的分桶arraylist,其值為arrayset.get(seq),再根據(jù)計(jì)算的桶中位置local從分桶arraylist中獲取對(duì)應(yīng)的數(shù)據(jù),其值為arrayset.get(seq).get(local)。
本實(shí)施例實(shí)現(xiàn)了根據(jù)索引獲取對(duì)應(yīng)的數(shù)據(jù)。獲取時(shí)通過(guò)簡(jiǎn)單的獲取分桶序號(hào)和桶中位置可以快速的獲取數(shù)據(jù),數(shù)據(jù)量很大時(shí),獲取的速度沒(méi)有降低,依然很有效率。
(4)數(shù)據(jù)的清理
當(dāng)數(shù)據(jù)無(wú)用是需要將數(shù)據(jù)清空,避免占用內(nèi)存。
清空前調(diào)用lock.writelock().lock()對(duì)數(shù)據(jù)進(jìn)行寫(xiě)的讀寫(xiě)鎖,避免清空的時(shí)候其他線程進(jìn)行寫(xiě)操作。
循環(huán)遍歷數(shù)據(jù)分桶arrayset,通過(guò)調(diào)用(arraylistlist:arrayset)實(shí)現(xiàn)循環(huán),調(diào)用list.clear()清空每個(gè)分桶集合的數(shù)據(jù)。
清空總數(shù)組arrayset集合,調(diào)用arrayset.clear()清空數(shù)據(jù)。
清空當(dāng)前分桶curarray集合,調(diào)用curarray.clear()清空數(shù)據(jù)。
數(shù)組arrayset中存儲(chǔ)的數(shù)據(jù)總數(shù)size設(shè)置為0,調(diào)用size=0。
結(jié)束前調(diào)用lock.writelock().unlock()釋放寫(xiě)的讀寫(xiě)鎖。
本實(shí)施例實(shí)現(xiàn)了數(shù)據(jù)的快速添加,獲取,清空操作。相比于java提供的基礎(chǔ)數(shù)據(jù)集合,能夠更好的滿足我們這種實(shí)際的開(kāi)發(fā)需要。有效的解決了arraylist添加大量數(shù)據(jù)導(dǎo)致性能下降的問(wèn)題,能夠快速的添加大量數(shù)據(jù),并能快速的查詢數(shù)據(jù)。
本發(fā)明還提供一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)裝置,包括:
存儲(chǔ)空間檢測(cè)模塊,用于當(dāng)進(jìn)行數(shù)據(jù)添加時(shí),獲取當(dāng)前存儲(chǔ)數(shù)組,所述當(dāng)前存儲(chǔ)數(shù)組的長(zhǎng)度為固定長(zhǎng)度;檢測(cè)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間是否已滿;
數(shù)據(jù)存儲(chǔ)模塊,用于當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間未滿時(shí),向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù);或者
當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間已滿時(shí),創(chuàng)建新存儲(chǔ)數(shù)組為當(dāng)前存儲(chǔ)數(shù)組,向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù),并將所述新存儲(chǔ)數(shù)組添加到數(shù)據(jù)存儲(chǔ)總數(shù)組中。
在一個(gè)實(shí)施例中,所述一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)裝置還包括:
數(shù)組創(chuàng)建模塊,用于創(chuàng)建所述數(shù)據(jù)存儲(chǔ)總數(shù)組,所述數(shù)據(jù)存儲(chǔ)總數(shù)組的類(lèi)型為數(shù)組類(lèi)型,所述數(shù)據(jù)存儲(chǔ)總數(shù)組中的元素為存儲(chǔ)數(shù)組,所述存儲(chǔ)數(shù)組的類(lèi)型為所述數(shù)組類(lèi)型,設(shè)置所述存儲(chǔ)數(shù)組的長(zhǎng)度為固定長(zhǎng)度。
在一個(gè)實(shí)施例中,所述一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)裝置還包括:
數(shù)據(jù)獲取模塊,用于基于數(shù)據(jù)索引,從所述數(shù)據(jù)存儲(chǔ)總數(shù)組中獲取所述數(shù)據(jù)索引對(duì)應(yīng)的特定存儲(chǔ)數(shù)組,在所述特定存儲(chǔ)數(shù)組中獲取所述數(shù)據(jù)索引對(duì)應(yīng)的數(shù)據(jù)。
在一個(gè)實(shí)施例中,所述一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)裝置還包括:
數(shù)據(jù)清理模塊,用于當(dāng)刪除所存儲(chǔ)的數(shù)據(jù)時(shí),遍歷所述數(shù)據(jù)存儲(chǔ)總隊(duì)列,清空所述數(shù)據(jù)存儲(chǔ)總隊(duì)列中的每一個(gè)存儲(chǔ)隊(duì)列中的數(shù)據(jù),并清空所述數(shù)據(jù)存儲(chǔ)總隊(duì)列中的存儲(chǔ)隊(duì)列,將所述數(shù)據(jù)存儲(chǔ)總隊(duì)列的數(shù)據(jù)總數(shù)設(shè)置為0。
在一個(gè)實(shí)施例中,所述存儲(chǔ)空間檢測(cè)模塊中所述檢測(cè)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間是否已滿包括:
獲取所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)據(jù)總數(shù),將所述數(shù)據(jù)總數(shù)與所述固定長(zhǎng)度的模運(yùn)算,獲取第一模值;
當(dāng)所述第一模值為0時(shí),檢測(cè)結(jié)果為所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間已滿,否則檢測(cè)結(jié)果為所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間未滿。
所述數(shù)據(jù)存儲(chǔ)模塊還包括:向所述當(dāng)前存儲(chǔ)數(shù)組或者所述新存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù)后,將所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)據(jù)總數(shù)加1。
所述數(shù)據(jù)獲取模塊進(jìn)一步包括:
存儲(chǔ)數(shù)組索引單元,用于將所述數(shù)據(jù)索引與所述固定長(zhǎng)度進(jìn)行除運(yùn)算,獲取整數(shù)值;
獲取存儲(chǔ)數(shù)組單元,用于以所述整數(shù)值為存儲(chǔ)數(shù)組索引,在所述數(shù)據(jù)存儲(chǔ)總數(shù)組中獲取特定存儲(chǔ)數(shù)組;
當(dāng)前索引單元,用于將所述數(shù)據(jù)索引與所述固定長(zhǎng)度進(jìn)行模運(yùn)算,獲取第二模值;以及
獲取數(shù)據(jù)單元,用于以所述第二模值為當(dāng)前索引,在所述特定存儲(chǔ)數(shù)組獲取所述數(shù)據(jù)索引對(duì)應(yīng)的數(shù)據(jù)。
所述存儲(chǔ)空間檢測(cè)模塊還包括獲取讀寫(xiě)鎖,所述數(shù)據(jù)存儲(chǔ)模塊還包括釋放所述讀寫(xiě)鎖;所述讀寫(xiě)鎖,用于對(duì)所述數(shù)據(jù)存儲(chǔ)總數(shù)組及當(dāng)前存儲(chǔ)數(shù)組進(jìn)行寫(xiě)保護(hù)。
所述數(shù)據(jù)獲取模塊還包括:當(dāng)所述數(shù)據(jù)索引大于所述數(shù)據(jù)存儲(chǔ)總數(shù)組的數(shù)據(jù)總數(shù)時(shí),返回空數(shù)據(jù)。
所述數(shù)據(jù)清理模塊還包括在清理數(shù)據(jù)之前獲取所述讀寫(xiě)鎖,和在清理數(shù)據(jù)之后釋放所述讀寫(xiě)鎖。
本發(fā)明所述一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法及裝置,提出了一種數(shù)據(jù)結(jié)構(gòu),可以線性存儲(chǔ)數(shù)據(jù),在數(shù)據(jù)量很大的情況下,可以快速插入數(shù)據(jù),根據(jù)索引快速取得數(shù)據(jù),對(duì)系統(tǒng)資源消耗更少,性能更高。
圖2示出了本發(fā)明實(shí)施例數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法的設(shè)備的結(jié)構(gòu)框圖。
參照?qǐng)D2,所述數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法的設(shè)備,包括:處理器(processor)301、存儲(chǔ)器(memory)302、通信接口(communicationsinterface)303和總線304;
其中,
所述處理器301、存儲(chǔ)器302、通信接口303通過(guò)所述總線304完成相互間的通信;
所述通信接口303用于該設(shè)備與數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法的通信設(shè)備之間的信息傳輸;
所述處理器301用于調(diào)用所述存儲(chǔ)器302中的程序指令,以執(zhí)行上述各方法實(shí)施例所提供的方法,例如包括:當(dāng)進(jìn)行數(shù)據(jù)添加時(shí),獲取當(dāng)前存儲(chǔ)數(shù)組,所述當(dāng)前存儲(chǔ)數(shù)組的長(zhǎng)度為固定長(zhǎng)度;檢測(cè)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間是否已滿;當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間未滿時(shí),向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù);或者當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間已滿時(shí),創(chuàng)建新存儲(chǔ)數(shù)組為當(dāng)前存儲(chǔ)數(shù)組,向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù),并將所述新存儲(chǔ)數(shù)組添加到數(shù)據(jù)存儲(chǔ)總數(shù)組中。
本發(fā)明另一實(shí)施例公開(kāi)一種計(jì)算機(jī)程序產(chǎn)品,所述計(jì)算機(jī)程序產(chǎn)品包括存儲(chǔ)在非暫態(tài)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上的計(jì)算機(jī)程序,所述計(jì)算機(jī)程序包括程序指令,當(dāng)所述程序指令被計(jì)算機(jī)執(zhí)行時(shí),計(jì)算機(jī)能夠執(zhí)行上述各方法實(shí)施例所提供的方法,例如包括:當(dāng)進(jìn)行數(shù)據(jù)添加時(shí),獲取當(dāng)前存儲(chǔ)數(shù)組,所述當(dāng)前存儲(chǔ)數(shù)組的長(zhǎng)度為固定長(zhǎng)度;檢測(cè)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間是否已滿;當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間未滿時(shí),向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù);或者當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間已滿時(shí),創(chuàng)建新存儲(chǔ)數(shù)組為當(dāng)前存儲(chǔ)數(shù)組,向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù),并將所述新存儲(chǔ)數(shù)組添加到數(shù)據(jù)存儲(chǔ)總數(shù)組中。
本發(fā)明另一實(shí)施例提供一種非暫態(tài)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述非暫態(tài)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)存儲(chǔ)計(jì)算機(jī)指令,所述計(jì)算機(jī)指令使所述計(jì)算機(jī)執(zhí)行上述各方法實(shí)施例所提供的方法,例如包括:當(dāng)進(jìn)行數(shù)據(jù)添加時(shí),獲取當(dāng)前存儲(chǔ)數(shù)組,所述當(dāng)前存儲(chǔ)數(shù)組的長(zhǎng)度為固定長(zhǎng)度;檢測(cè)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間是否已滿;當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間未滿時(shí),向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù);或者當(dāng)所述當(dāng)前存儲(chǔ)數(shù)組的存儲(chǔ)空間已滿時(shí),創(chuàng)建新存儲(chǔ)數(shù)組為當(dāng)前存儲(chǔ)數(shù)組,向所述當(dāng)前存儲(chǔ)數(shù)組寫(xiě)入待存儲(chǔ)數(shù)據(jù),并將所述新存儲(chǔ)數(shù)組添加到數(shù)據(jù)存儲(chǔ)總數(shù)組中。
本領(lǐng)域普通技術(shù)人員可以理解:實(shí)現(xiàn)上述方法實(shí)施例的全部或部分步驟可以通過(guò)程序指令相關(guān)的硬件來(lái)完成,前述的程序可以存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),執(zhí)行包括上述方法實(shí)施例的步驟;而前述的存儲(chǔ)介質(zhì)包括:rom、ram、磁碟或者光盤(pán)等各種可以存儲(chǔ)程序代碼的介質(zhì)。
以上所描述的數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法的設(shè)備等實(shí)施例僅僅是示意性的,其中所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部模塊來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性的勞動(dòng)的情況下,即可以理解并實(shí)施。
通過(guò)以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到各實(shí)施方式可借助軟件加必需的通用硬件平臺(tái)的方式來(lái)實(shí)現(xiàn),當(dāng)然也可以通過(guò)硬件。基于這樣的理解,上述技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品可以存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,如rom/ram、磁碟、光盤(pán)等,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行各個(gè)實(shí)施例或者實(shí)施例的某些部分所述的方法。
最后,本申請(qǐng)的方法僅為較佳的實(shí)施方案,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。