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。欢迎大家指正、讨论。

Giraph源代码分析(六)——Edge 分析的更多相关文章

  1. x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  2. x264源代码简单分析:宏块分析(Analysis)部分-帧内宏块(Intra)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  3. 手机自动化测试:Appium源码分析之跟踪代码分析六

    手机自动化测试:Appium源码分析之跟踪代码分析六   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ...

  4. 实验 六:分析linux内核创建一个新进程的过程

    实验六:分析Linux内核创建一个新进程的过程 作者:王朝宪  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...

  5. 编译原理(六)自底向上分析之LR分析法

    自底向上分析之LR分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本概念 1. LR分析:从左到右扫描(L)自底向上进行规约(R),是规范规约,也即最右推导(规范推导) ...

  6. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  7. [转载] 常用 Java 静态代码分析工具的分析与比较

    转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...

  8. ⑥NuPlayer播放源码分析之DecoderBase分析

    NuPlayer播放源码分析之DecoderBase分析 [时间:2017-02] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,DecoderBase,Med ...

  9. 【转载】常用 Java 静态代码分析工具的分析与比较

    摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后 ...

  10. linux内核中socket的创建过程源码分析(详细分析)

    1三个相关数据结构. 关于socket的创建,首先需要分析socket这个结构体,这是整个的核心. 104 struct socket { 105         socket_state       ...

随机推荐

  1. LuoguP2754 [CTSC1999]家园(分层图,最大流)

    题目背景 none! 题目描述 由于人类对自然资源的消耗,人们意识到大约在 2300 年之后,地球就不能再居住了.于是在月球上建立了新的绿地,以便在需要时移民.令人意想不到的是,2177 年冬由于未知 ...

  2. 今日SGU 5.10

    SGU 168 题意:从a矩阵求出b矩阵,规则直接看题目就行了,不好打字说明 收获:dp #include<bits/stdc++.h> #define de(x) cout<< ...

  3. linux6.0系统如何安装portmap

    因为在6.0的系统里,portmap已经改名了.在Redhat或CentOS5中可以使用 service portmap start启动服务,然后在启动nfs服务,实现挂载. 6里面可是试试 serv ...

  4. VPS 上线监控监控脚本

    文件地址 https://github.com/yourshell/yisuo-script/blob/master/vpstz/vpsmon.zip https://download.csdn.ne ...

  5. softInputMode- 软件盘的设置

    今天遇到一个问题,就是软件盘弹出来以后,会把之前的布局界面整个的挤到屏幕的外面,而且按下返回建以后,这个软件盘占据的空间会留下一个黑色的背景.在网上查找了很多的方法,刚开始都是说,如下方法 <a ...

  6. 版本管理系统:svn和git

    svn是常用的版本管理系统,解决团队协作开发和版本管理问题, 一.服务器端:是一个文件存储仓库,可以设置用户并管理其访问的权限.主要功能包括 ①设置文件存储路径,是管理文件版本的基础 ②设置用户:可以 ...

  7. Flask项目之手机端租房网站功能测试(完结)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶注册和登录以及用户退出功能 二丶上传头像功能和修改用户名功能测试 三丶发布房源以及实名认证功能测试 四丶网站房屋搜索功能 ...

  8. Linux中iptables学习

    防火墙:是一种位于内部网络与外部网络之间安全的防护系统,依照特定的规则,允许或是限制传输的数据通过.iptables通常被用作类UNIX系统中的防火墙,更准确的说,可以称为iptables/netfi ...

  9. l洛谷 P3926 SAC E#1 - 一道不可做题 Jelly

    P3926 SAC E#1 - 一道不可做题 Jelly 题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢吃蒟蒻果冻.而SOL菌也很喜欢蒟蒻果冻. 有一 ...

  10. 洛谷 P1109 学生分组

    P1109 学生分组 题目描述 有N组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界R和下界L(L<=R),每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使 ...