国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法及裝置與流程

      文檔序號(hào):11406777閱讀:403來(lái)源:國(guó)知局
      一種數(shù)據(jù)數(shù)組的大容量存儲(chǔ)方法及裝置與流程

      本發(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)。

      當(dāng)前第1頁(yè)1 2 
      網(wǎng)友詢問(wèn)留言 已有0條留言
      • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1