您好,登錄后才能下訂單哦!
1.在Vertex類中,頂點(diǎn)的存儲(chǔ)方式采用鄰接表形式。每個(gè)頂點(diǎn)有 VertexId、VertexValue、OutgoingEdges和Halt,boolean型的halt變量用于記錄頂點(diǎn)的狀態(tài),false時(shí)表示active,true表示inactive狀態(tài)。 片段代碼如下。
cdn.xitu.io/2019/8/12/16c84c9359655583?w=600&h=215&f=png&s=33609">
2.org.apache.giraph.edge.Edge 接口,用于存儲(chǔ)頂點(diǎn)的邊,每條邊包含targetVertexId和edgeValue兩個(gè)屬性。類關(guān)系圖如下:
Giraph默認(rèn)使用DefaultEdge類存儲(chǔ)邊,該類中有兩個(gè)變量: I targetVertexId和 E value,I為頂點(diǎn)ID的類型,E為邊的類型。注意,DefaultEdge類同時(shí)繼承ReusableEdge<I,E>接口,在ReusableEdge<I,E>類的定義中,有如下說明文字:
A complete edge, the target vertex and the edge value. Can only be one edge with a destination vertex id per edge map. This edge can be reused, that is you can set it's target vertex ID and edge value. Note: this class is useful for certain optimizations, but it's not meant to be exposed to the user. Look at MutableEdge instead.
從上述說明文字可知,edge可以被重用,只需要修改targetVertexId和value的值就行。即每個(gè)Vertex若有多條出邊,只會(huì)創(chuàng)建一個(gè)DefaultEdge對(duì)象來存儲(chǔ)邊。
3.org.apache.giraph.edge.OutEdges 用于存儲(chǔ)每個(gè)頂點(diǎn)的out-edges。從Vertex類的定義可知,頂點(diǎn)的每條邊都被存儲(chǔ)在OutEdges類型的edge對(duì)象中,OutEdges接口的關(guān)系圖如下:
Giraph默認(rèn)的使用ByteArrayEdges<I,E>,每個(gè)頂點(diǎn)的所有邊都被存儲(chǔ)在byte[ ]中。當(dāng)頂點(diǎn)向它的出邊發(fā)送消息時(shí),需要遍歷Vertex類中的edges對(duì)象。示例代碼如下:
注意:由DefaultEdge的定義可知,遍歷getEdges時(shí),返回的Edge對(duì)象時(shí)同一個(gè)對(duì)象,只是該對(duì)象中值改變了。下面繼續(xù)查看代碼來證明此觀點(diǎn)。
查看ByteArrayEdges類的iterator()方法,如下:
返回的是內(nèi)部類ByteArrayEdgeIterator對(duì)象,定義如下:
總結(jié):當(dāng)頂點(diǎn)的出度很大時(shí),此優(yōu)化甚好,能很好的節(jié)約內(nèi)存。如UK-2005數(shù)據(jù)中,頂點(diǎn)的最大出度為 5213。
假設(shè)頂點(diǎn)1的出度頂點(diǎn)有<2 , 0.4>,<3 , 7.8> ,<5 , 6.4> 。如下代碼:
輸出結(jié)果為:
[ 2 ]
[ 3 , 3 ]
[ 5 , 5 , 5 ]
并非是希望的 [ 2 , 3 , 5 ]
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。