果該邊的時(shí)間戳位于該時(shí)間戳區(qū)間內(nèi),則掃描該內(nèi)存塊Block中的邊,刪除比該邊的時(shí)間戳早的邊。
[0021]進(jìn)一步的,所述數(shù)據(jù)存儲(chǔ)管理器將存儲(chǔ)資源分成兩類:粗粒度存儲(chǔ)資源和細(xì)粒度存儲(chǔ)資源,所述數(shù)據(jù)存儲(chǔ)管理器的內(nèi)存中設(shè)置有界緩存窗口 ;其中所述粗粒度存儲(chǔ)資源用于存儲(chǔ)設(shè)定的大文件,并常駐于內(nèi)存,所述細(xì)粒度存儲(chǔ)資源用于存儲(chǔ)按需分配的小文件;所述數(shù)據(jù)存儲(chǔ)管理器按需將細(xì)粒度存儲(chǔ)資源載入該有界緩存窗口,當(dāng)該有界緩存窗口被占滿,需要加載新的細(xì)粒度存儲(chǔ)資源時(shí),采用緩存替換算法將該有界緩存窗口中已有的細(xì)粒度存儲(chǔ)資源換出,然后載入新的細(xì)粒度存儲(chǔ)資源。
[0022]進(jìn)一步的,所述粗粒度存儲(chǔ)資源和所述細(xì)粒度存儲(chǔ)資源均劃分成固定大小的所述內(nèi)存塊Block,每一內(nèi)存塊Block擁有唯一的Block ID。
[0023]進(jìn)一步的,所述數(shù)據(jù)存儲(chǔ)管理器首先分配粗粒度存儲(chǔ)資源的內(nèi)存塊Block,當(dāng)粗粒度存儲(chǔ)資源耗盡時(shí),開始按需地動(dòng)態(tài)地分配細(xì)粒度存儲(chǔ)資源在內(nèi)存塊Block。
[0024]如權(quán)利要求5所述的方法,其特征在于,所述數(shù)據(jù)存儲(chǔ)器定期地掃描圖數(shù)據(jù),將過期的圖數(shù)據(jù)從所述粗粒度存儲(chǔ)資源中刪除并轉(zhuǎn)存到所述細(xì)粒度存儲(chǔ)資源中。
[0025]一種圖數(shù)據(jù)查詢方法,其特征在于,當(dāng)數(shù)據(jù)存儲(chǔ)管理器收到訪問頂點(diǎn)V的訪問請(qǐng)求時(shí),數(shù)據(jù)存儲(chǔ)管理器將該頂點(diǎn)V及其k階鄰域傳輸給請(qǐng)求者;請(qǐng)求者將返回?cái)?shù)據(jù)緩存在本地,下次查詢時(shí),首先檢查本地的緩存,如果不存在查詢的頂點(diǎn),則將訪問請(qǐng)求發(fā)送給所述數(shù)據(jù)存儲(chǔ)管理器。
[0026]進(jìn)一步的,所述頂點(diǎn)V的k階鄰域?yàn)閺脑擁旤c(diǎn)V出發(fā)經(jīng)過最短距離k條邊可達(dá)的全部頂點(diǎn)構(gòu)成的集合。
[0027]與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果為:
[0028](I)能滿足動(dòng)態(tài)更新。社交網(wǎng)絡(luò)用戶頻繁產(chǎn)生數(shù)據(jù),在實(shí)際應(yīng)用中,數(shù)據(jù)分析對(duì)數(shù)據(jù)的時(shí)效性具有很高的要求,用戶的行為產(chǎn)生的新數(shù)據(jù)需要不斷的加入。
[0029](2)適合處理數(shù)據(jù)稀疏的場景。在社交網(wǎng)絡(luò)中,用戶的好友數(shù)目的差別很多,少數(shù)用戶(如大V),擁有很多好友,而眾多普通用戶的好友數(shù)目稀少,從統(tǒng)計(jì)角度看,社交網(wǎng)絡(luò)數(shù)據(jù)是平均出度很小的極度稀疏圖。
[0030](3)適合隨機(jī)訪問。在訪問圖數(shù)據(jù)的過程中,不同于訪問順序數(shù)據(jù)集,一般先訪問某個(gè)頂點(diǎn),然后訪問相鄰頂點(diǎn),再次訪問相鄰頂點(diǎn)的相鄰頂點(diǎn),如此不斷地從一個(gè)頂點(diǎn)出發(fā),由近及遠(yuǎn),最后完成對(duì)整個(gè)圖的遍歷。
【附圖說明】
[0031]圖1本發(fā)明方法中的數(shù)據(jù)存儲(chǔ)管理;
[0032]圖2為頂點(diǎn)鄰域的存儲(chǔ)模型;
[0033]圖3為本地寫實(shí)驗(yàn)結(jié)果對(duì)比圖;
[0034]圖4為本地讀實(shí)驗(yàn)結(jié)果對(duì)比圖;
[0035]圖5為實(shí)際數(shù)據(jù)和存儲(chǔ)資源消耗對(duì)比圖;
[0036]圖6為遠(yuǎn)程寫的實(shí)驗(yàn)結(jié)果對(duì)比圖;
[0037]圖7為遠(yuǎn)程讀的實(shí)驗(yàn)結(jié)果對(duì)比圖;
[0038]圖8為數(shù)據(jù)更新的實(shí)驗(yàn)結(jié)果對(duì)比圖;
[0039]圖9遠(yuǎn)程預(yù)取和非預(yù)取的性能對(duì)比圖。
【具體實(shí)施方式】
[0040]以下結(jié)合附圖對(duì)本發(fā)明的原理和特征進(jìn)行描述,所舉實(shí)例只用于解釋本發(fā)明,并非用于限定本發(fā)明的范圍。
[0041]本發(fā)明可以分為三部分:零移動(dòng)的數(shù)據(jù)組織策略、自適應(yīng)數(shù)據(jù)規(guī)模的存儲(chǔ)管理策略以及應(yīng)用感知的異地預(yù)取策略。
[0042]零移動(dòng)的數(shù)據(jù)組織策略
[0043]圖數(shù)據(jù)增量更新是指將產(chǎn)生的新邊插入圖中和從圖中刪除過時(shí)的舊邊。將社交媒體用戶的每時(shí)每刻的活動(dòng)足跡產(chǎn)生新鮮圖數(shù)據(jù)需要予以存儲(chǔ),而圖數(shù)據(jù)中不再具有使用價(jià)值的過時(shí)圖數(shù)據(jù)予以刪除。
[0044]本文采用Key-Value存儲(chǔ),以頂點(diǎn)ID做Key,以頂點(diǎn)鄰域做Value。頂點(diǎn)鄰域的數(shù)據(jù)組織特點(diǎn)有:1)采用以時(shí)間戳將頂點(diǎn)相鄰的邊有序的存儲(chǔ)到Block雙向鏈表中,便于從鏈表的頭部插入新邊,從尾部刪除舊邊。2)為了降低邊在雙向鏈表的存儲(chǔ)代價(jià),將與頂點(diǎn)相連的多條邊順序存儲(chǔ)在固定大小的內(nèi)存塊Block中,存儲(chǔ)同一頂點(diǎn)的邊的block塊構(gòu)成Block雙向鏈表。Block由專門負(fù)責(zé)存儲(chǔ)資源分配的Block池管理器負(fù)責(zé)分配回收。3)頂點(diǎn)鄰域由數(shù)據(jù)結(jié)構(gòu)Vertex和Block鏈表構(gòu)成,其中Vertex是用戶自定義的C語言的結(jié)構(gòu),其中包含了頂點(diǎn)的屬性信息和指向Block雙向鏈表頭部和尾部的索引信息。
[0045]當(dāng)向頂點(diǎn)鄰域插入新邊時(shí),將新邊按時(shí)間戳排序,先查看鏈表頭部的Block是否未滿,如果沒有滿,就追加在該Block的頭部;如果頭部的Block已滿,且依然有待插入的新邊,則由Block池管理器分配新的Block,添加到鏈表的頭部,用待插入邊填充新Block。重復(fù)該過程,直至更新完全部的新邊。當(dāng)刪除頂點(diǎn)鄰域中的老化邊時(shí),從Block雙鏈表尾部的Block開始,為了快速的刪除舊邊,Block中有專門的數(shù)據(jù)域保存所存邊的時(shí)間戳區(qū)間。如果想要?jiǎng)h除的邊的時(shí)間戳小于時(shí)間戳區(qū)間的下界,則結(jié)束刪除操作;當(dāng)待刪邊的時(shí)間戳大于時(shí)間戳區(qū)間的上界,則從鏈表末尾移除該Block,通過Block管理池回收已刪除的Block ;如果當(dāng)待刪除邊的時(shí)間戳出現(xiàn)在時(shí)間戳區(qū)間中,則掃描該Block中的邊,刪除比待刪除邊的時(shí)間戳老的邊,并結(jié)束操作。
[0046]采用Block雙向鏈表存儲(chǔ)以時(shí)間戳有序的出邊的方式組織頂點(diǎn)鄰域,有諸多優(yōu)點(diǎn)。第一,避免采用單條邊存儲(chǔ)的小額內(nèi)存空間的頻繁動(dòng)態(tài)分配和存儲(chǔ)過多額外的元數(shù)據(jù)。因?yàn)閳D數(shù)據(jù)的更新比較頻繁,而每條邊的數(shù)據(jù)量比較少,更新操作引起小額內(nèi)存的頻繁動(dòng)態(tài)分配;并且邊中的元數(shù)據(jù)相對(duì)于實(shí)際數(shù)據(jù)的比率也加大,導(dǎo)致內(nèi)存內(nèi)存的分配效率和利用率降低,而且單挑邊的存儲(chǔ)也不利于訪問頂點(diǎn)鄰域。第二,避免了采取頂點(diǎn)的全部出邊整體存儲(chǔ)的方式不利于圖數(shù)據(jù)動(dòng)態(tài)更新的問題,采用整體的存儲(chǔ),頂點(diǎn)的全部出邊存儲(chǔ)blob (動(dòng)態(tài)分配的長度不固定的連續(xù)內(nèi)存空間),新邊插入操作會(huì)導(dǎo)致原存儲(chǔ)空間耗盡,必須開辟足夠大的新存儲(chǔ)空間,挪動(dòng)原來的數(shù)據(jù),并插入新邊。舊邊刪除到操作會(huì)導(dǎo)致存儲(chǔ)空間空余數(shù)量可觀的不可用的內(nèi)部碎片。通常采用定期緊縮操作,數(shù)據(jù)移動(dòng)重新整理圖數(shù)據(jù),以消除碎片。這種組織方式雖然訪問頂點(diǎn)鄰域具有很高的性能,但是緊縮操作會(huì)顯著影響圖數(shù)據(jù)的隨機(jī)增量跟新的效率。
[0047]在本系統(tǒng)中,充分考慮了圖數(shù)據(jù)的特征以及對(duì)圖數(shù)據(jù)的訪問特性,設(shè)計(jì)了一種圖數(shù)據(jù)的頂點(diǎn)鄰域存儲(chǔ)模型,如圖2所示。每個(gè)Block由三部分組成,第一部分為指向前一個(gè)block的指針,第二部分為指向后一個(gè)block的指針,第三部分為該block存儲(chǔ)的邊。此模型可以有效地支持圖數(shù)據(jù)更新。
[0048]本文提出的圖數(shù)據(jù)存儲(chǔ)方法在數(shù)據(jù)更新方面與業(yè)界使用的方式有如下幾點(diǎn)不同:
[0049]首先,Redis和Neo4j的數(shù)據(jù)存儲(chǔ)采用連續(xù)分配的方式,但隨著數(shù)據(jù)不斷地更新,超出已分配存儲(chǔ)塊時(shí),需要分配更大的連續(xù)內(nèi)存塊,然后將原來的數(shù)據(jù)挪動(dòng)到新塊中,并將新數(shù)據(jù)插入。頻繁的數(shù)據(jù)更新,會(huì)造成數(shù)據(jù)的頻繁挪動(dòng)。盡管Redis采用了一種預(yù)先分配機(jī)制,每次分配的內(nèi)存多于實(shí)際需要的內(nèi)存數(shù)目,以應(yīng)對(duì)未來可能的數(shù)據(jù)擴(kuò)增。但沒有從根本上解決內(nèi)存數(shù)據(jù)挪動(dòng)的問題。而本發(fā)明采用鏈接分配的方式,通