HamaWhite 原创,转载请注明出处。欢迎大家增加Giraph
技术交流群
: 228591158

欢迎訪问: 西北工业大学 - 大数据与知识管理研究室 (Northwestern Polytechnical University - BigData and Knowledge Management Lab),链接:http://wowbigdata.cn/http://wowbigdata.net.cn/http://wowbigdata.com.cn

1. 在Vertex类中,顶点的存储方式採用邻接表形式。每一个顶点有 VertexId、VertexValue、OutgoingEdges和Halt,boolean型的halt变量用于记录顶点的状态,false时表示active,true表示inactive状态。 片段代码例如以下:

/** Vertex id. */
private I id;
/** Vertex value. */
private V value;
/** Outgoing edges. */
private OutEdges<I, E> edges;
/** If true, do not do anymore computation on this vertex. */
private boolean halt;
/** Global graph state **/
private GraphState<I, V, E, M> graphState;

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGluX2ptYWls/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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<I,E> 用于存储每一个顶点的out-edges。从Vertex类的定义可知,顶点的每条边都被存储在OutEdges<I,E>类型的edge对象中。OutEdges<I,E>接口的关系图例如以下:

Giraph默认的使用ByteArrayEdges<I,E>,每一个顶点的全部边都被存储在byte[ ]中。当顶点向它的出边发送消息时,须要遍历Vertex类中的edges对象。

演示样例代码例如以下:

//遍历全部的边。getEdges()返回的是Vertex中的edges对象,
//那么该for循环会调用edges对象的iterator()方法,即调用ByteArrayEdges类中的iterator方法。
for (Edge<LongWritable, FloatWritable> edge : getEdges()) {
//edge对象表示每条边。默觉得DefaultEdge类型。 double distance = minDist + edge.getValue().get();
sendMessage(edge.getTargetVertexId(), new DoubleWritable(distance));
}

注意:由DefaultEdge的定义可知,遍历getEdges时,返回的Edge对象时同一个对象。仅仅是该对象中值改变了

以下继续查看代码来证明此观点。

查看ByteArrayEdges类的iterator()方法,例如以下。

 @Override
public Iterator<Edge<I, E>> iterator() {
return new ByteArrayEdgeIterator();
}

返回的是内部类ByteArrayEdgeIterator对象。定义例如以下:

 /**
* Iterator that reuses the same Edge object.
*/
private class ByteArrayEdgeIterator
extends UnmodifiableIterator<Edge<I, E>> {
//extendedDataInput存储全部Edge边相应的字节
/** Input for processing the bytes */
private ExtendedDataInput extendedDataInput =
getConf().createExtendedDataInput(
serializedEdges, 0, serializedEdgesBytesUsed);
//创建一个Edge对象,默认返回的是DefaultEdge对象。 /** Representative edge object. */
private ReusableEdge<I, E> representativeEdge =
getConf().createReusableEdge(); @Override
public boolean hasNext() {
return serializedEdges != null && extendedDataInput.available() > 0;
} @Override
public Edge<I, E> next() {
try {
//核心:此处遍历每条Edge时,都是从extendedDataInput读入每天边的数据存储在representativeEdge对象中。
//从此处就可知,每一个顶点的全部出边仅仅有一个Edge对象, 遍历时改动每条边的数据的就可以
WritableUtils.readEdge(extendedDataInput, representativeEdge);
} catch (IOException e) {
throw new IllegalStateException("next: Failed on pos " +
extendedDataInput.getPos() + " edge " + representativeEdge);
}
return representativeEdg
}
}

总结:当顶点的出度非常大时,此优化甚好,能非常好的节约内存。如UK-2005数据中,顶点的最大出度为 5213。

如果顶点1的出度顶点有<2 , 0.4>。<3 , 7.8> ,<5 , 6.4> 。

例如以下代码:

//定义list列表用于存储出度顶点的Id。
List<LongWritable> list=new ArrayList<LongWritable>();
for (Edge<LongWritable, FloatWritable> edge : getEdges()) {
list.add(edge.getTargetVertexId());
System.out.println(list);
}

输出结果为:

[ 2 ]

[ 3 ,  3 ]

[ 5 , 5 , 5 ]

并不是是希望的 [ 2 , 3 , 5 ]

完。

本人原创,转载请注明出处!

本人QQ:530422429。欢迎大家指正、讨论。

最新文章

  1. 改写js原装的alert样式
  2. IIS性能相关的配置、命令
  3. Promise 原理探究及其简单实现
  4. Docker 安装部署
  5. 配置Junit测试程序
  6. 夺命雷公狗—angularjs—3—表单验证的高级用法
  7. Python学习教程(learning Python)--3.3.1 Python下的布尔表达式
  8. 引擎设计跟踪(九.14.2a) 导出插件问题修复和 Tangent Space 裂缝修复
  9. Iframe跨域_ASP.NET
  10. SVN的使用(转发)
  11. 说说数据库架构,ORM缓存和路由
  12. 编程珠玑I算法总结
  13. 记一个常见的ms sql server中取第N条记录的方法
  14. namecheap域名设置Cloudflare为第三方DNS
  15. 《HTML与CSS 第一章 认识HTML》读书笔记
  16. 关于面试总结4-python笔试题
  17. unity, 立即生效动画:Animation.sample()
  18. Spring boot 通用配置文件模板
  19. Windows 访问 Oracle
  20. Scala基础:面向对象之对象和继承

热门文章

  1. 威佐夫博奕(Wythoff Game)
  2. sim800c GPRS模块的透传模式
  3. mvc定时执行任务(获取气象台的气象数据,定时新增)
  4. git 常用命令(分支)
  5. 决策树2 -- CART算法
  6. 1.2 Use Cases中 Messaging官网剖析(博主推荐)
  7. Java Web学习总结(11)——Session使用示例教程
  8. cocos2d-x 3.x游戏开发学习笔记(1)--mac下配置cocos2d-x 3.x开发环境
  9. c++中的相对路径
  10. nyoj999 师傅又被妖怪抓走了 (预处理+bfs+状态压缩)