您好,登錄后才能下訂單哦!
1.在Vertex類中,頂點的存儲方式采用鄰接表形式。每個頂點有 VertexId、VertexValue、OutgoingEdges和Halt,boolean型的halt變量用于記錄頂點的狀態,false時表示active,true表示inactive狀態。 片段代碼如下。
cdn.xitu.io/2019/8/12/16c84c9359655583?w=600&h=215&f=png&s=33609">
2.org.apache.giraph.edge.Edge 接口,用于存儲頂點的邊,每條邊包含targetVertexId和edgeValue兩個屬性。類關系圖如下:
Giraph默認使用DefaultEdge類存儲邊,該類中有兩個變量: I targetVertexId和 E value,I為頂點ID的類型,E為邊的類型。注意,DefaultEdge類同時繼承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的值就行。即每個Vertex若有多條出邊,只會創建一個DefaultEdge對象來存儲邊。
3.org.apache.giraph.edge.OutEdges 用于存儲每個頂點的out-edges。從Vertex類的定義可知,頂點的每條邊都被存儲在OutEdges類型的edge對象中,OutEdges接口的關系圖如下:
Giraph默認的使用ByteArrayEdges<I,E>,每個頂點的所有邊都被存儲在byte[ ]中。當頂點向它的出邊發送消息時,需要遍歷Vertex類中的edges對象。示例代碼如下:
注意:由DefaultEdge的定義可知,遍歷getEdges時,返回的Edge對象時同一個對象,只是該對象中值改變了。下面繼續查看代碼來證明此觀點。
查看ByteArrayEdges類的iterator()方法,如下:
返回的是內部類ByteArrayEdgeIterator對象,定義如下:
總結:當頂點的出度很大時,此優化甚好,能很好的節約內存。如UK-2005數據中,頂點的最大出度為 5213。
假設頂點1的出度頂點有<2 , 0.4>,<3 , 7.8> ,<5 , 6.4> 。如下代碼:
輸出結果為:
[ 2 ]
[ 3 , 3 ]
[ 5 , 5 , 5 ]
并非是希望的 [ 2 , 3 , 5 ]
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。