简单的说,比如下列图数据:
1 2
2 3
4 2
5 1
该图在计算时,对于点3而言,由于Giraph源码中,处理消息的时候是按照顶点分区进行处理,就是:
for(vertexId : Vertex Partition) {
Itr<M> msgs = getMsg(vertexId)
vertex.dosth(msgs)
}
的形式,
而我在修改的时候,改成了以消息为轮询单位,即
for(M msg : msgs) {
V vertexId = msg.getVertexId()
vertex = VertexPartition.get(vertexId)
vertex.dosth(msg)
}
这样我在计算的时候会造成对于3这类点报错,即找不到该点,因为上述两种方法在加载顶点分区的时候都是一样的。
此类问题的解决方法很简单,就是使用我设计的重编码算法,在保持图结构的情况下对图进行重新编码,把3这个点加进原始图数据中,这样就不会漏掉2->3的消息了。