давно я искал способ обновить свойство узлов в GraphX. я работаю над графиком, который состоит из узлов и свойства узлов. например (1, (2, правда)). в этом примере 1 - это идентификатор узла, 2 - это метка узла, а истина означает, когда узел был посещен. я загрузил график в GraphLoader и создал распределенный граф с помощью СДР.
Структура, которую я использую для каждого узла, выглядит следующим образом:
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 секунд.
Вопрос : Существует ли какая-либо хорошая структура или какой-либо эффективный и идеальный метод для обновления свойства узлы в графе во время алгоритма? это действительно узкое место для меня, и я не могу решить это.
Я должен упомянуть, что алгоритм имеет итеративную природу, и на каждой итерации мне нужно обновлять свойства узлов на основе некоторых условий.
ПРИМЕЧАНИЕ : я использую unpersistVertices()
и graph.checkpoint()
, но опять-таки этот метод, который у меня есть, требует много времени для обновления свойств узлов!