我有一段时间在寻找一种更新 GraphX 中节点属性的方法。我正在研究一个由节点和节点属性组成的图。例如 (1,(2,true))。在此示例中,1 是节点 ID,2 是节点的标签,true 表示节点已被访问。我已经使用 GraphLoader 加载了图表,并通过 RDD 制作了分布式图表。
我为每个节点使用的结构如下:
case class nodes_properties(label: Int, isVisited: Boolean = false)
var work_graph = graph.mapVertices { case (node, property) => nodes_properties(node.toInt, false) }.cache()
当我想更新节点属性(例如其标签)时,我使用以下结构:
work_graph = work_graph.mapVertices((vid: VertexId, v: nodes_properties) => {
if (vid == my_node) nodes_properties(newLabel,true)
else v
})
这个结构满足了我的要求,但正如我所见,它的计算成本非常高,仅对于具有 30000 个节点的图来说,大约需要 4 分钟,而当我使用 MATLAB 执行相同操作时,大约需要 25 秒。
Question:在算法过程中,有没有好的结构或者有效且理想的方法来更新图中节点的属性?这对我来说确实是一个瓶颈,我无法解决这个问题。
我应该提到该算法具有迭代性质,并且在每次迭代时我需要根据某些条件更新节点属性。
NOTE: i use unpersistVertices()
and graph.checkpoint()
但我的这个方法在更新节点属性方面非常耗时!