Giraph源码分析(六)——边缘分析

  

1。在顶点类中,顶点的存储方式采用邻接表形式,每个顶点有VertexId, VertexValue, OutgoingEdges和停止,布尔型的停止变量用于记录顶点的状态,假时表示活跃,真表示不活跃的状态。片段代码如下。

  


2. org.apache.giraph.edge.edge接口,用于存储顶点的边,每条边包含targetVertexId和edgeValue两个属性。类关系图如下:

  

 Giraph源码分析(六)——边缘分析

  

Giraph默认使用DefaultEdge类存储边,该类中有两个变量:我targetVertexId和E值,我为顶点ID的类型、E为边的类型。注意,DefaultEdge类同时继承ReusableEdge<我,E>接口,在ReusableEdge<我,E>类的定义中,有如下说明文字:
一个完整的边缘,目标顶点和边值。可以alt=" Giraph源码分析(六)——边缘分析">

  

Giraph默认的使用ByteArrayEdges<我E>每个顶点的所有边都被存储在byte[]中。当顶点向它的出边发送消息时,需要遍历顶点类中边缘的对象。示例代码如下:

  

 Giraph源码分析(六)——边缘分析“> <br/>注意:由DefaultEdge的定义可知,遍历getEdges时,返回的边缘对象时同一个对象,只是该对象中值改变了。下面继续查看代码来证明此观点。<br/>查看ByteArrayEdges类的iterator()方法,如下:</p>
  <p> <img src=

  

总结:当顶点的出度很大时,此优化甚好,能很好的节约内存。如英国- 2005数据中,顶点的最大出度为5213。
假设顶点1的出度顶点有& lt; 2、0.4祝辞,& lt; 3、7.8比;& lt; 5, 6.4比;

。如下代码:   

 Giraph源码分析(六)——边缘分析“> <br/>输出结果为:<br/> [2] <br/> [3 3] <br/> [5, 5, 5] <br/>并非是希望的(2、3、5)</p><h2 class=Giraph源码分析(六)——边缘分析