Какой самый быстрый механизм сетевого графика для больших наборов данных?
В настоящее время мы имеем динамически обновляемый сетевой график, содержащий около 1500 узлов и 2000 ребер. Он постоянно растет. Наш текущий механизм компоновки использует Prefuse - в частности, направленную на силовую ориентацию - и занимает около 10 минут с массивным сервером, чтобы получить приятный, стабильный макет.
Я немного искал алгоритм GraphViz sfpd, но еще не тестировал его...
Есть ли более быстрые альтернативы, на которые я должен смотреть?
- Меня не волнует внешний вид узлов и ребер - мы обрабатываем это отдельно - просто помещаем
x, y
на узлы.
- Нам нужно иметь возможность манипулировать свойствами макета для определенных частей графика, например, применяя специальные более плотные или слабые пружины для определенных узлов.
Заранее благодарим и прошу прокомментировать, если вам нужна более конкретная информация, чтобы ответить!
РЕДАКТИРОВАТЬ: Я особенно ищу сравнение скорости между параметрами механизма компоновки. Тесты, конкретные примеры или просто личный опыт будут достаточными!
Ответы
Ответ 1
Я бы посмотрел OGDF, в частности http://www.ogdf.net/doku.php/tech:howto:frcl
Я не использовал OGDF, но я знаю, что Fast Multipole Multilevel - хороший алгоритм работы, и когда вы имеете дело с типами runtimes, связанными с силовым макетом с количеством узлов, которые вы хотите, это очень важно.
Почему, среди других причин, этот алгоритм является удивительным: метод Fast Multipole. Быстрый мультипольный метод является приближением матричного умножения, которое в малой степени уменьшает время выполнения матричного умножения O(). В идеале у вас будет код из примерно такого: http://mgarland.org/files/papers/layoutgpu.pdf, но я не могу найти его нигде; возможно, решение CUDA в любом случае не в вашей переулке.
Удачи.
Ответ 2
Я написал библиотеку графических чертежей на основе JavaScript VivaGraph.js.
Он вычисляет макет и отображает график с вершинами 2K +, 8,5K ребер в ~ 10-15 секунд. Если вам не нужна часть рендеринга, она должна быть еще быстрее.
Вот видео, демонстрирующее его в действии: Графический рендеринг WebGL с помощью VivaGraphJS.
Демо онлайн доступно здесь. WebGL требуется для просмотра демонстрационной версии, но не требуется для расчета схем графиков. Библиотека также работает под node.js, поэтому ее можно использовать как службу.
Пример использования API (только для макета):
var graph = Viva.Graph.graph(),
layout = Viva.Graph.Layout.forceDirected(graph);
graph.addLink(1, 2);
layout.run(50); // runs 50 iterations of graph layout
// print results:
graph.forEachNode(function(node) { console.log(node.position); })
Надеюсь, что это поможет:)
Ответ 3
Gephi Toolkit может быть тем, что вам нужно: некоторые макеты очень быстрые, но с хорошим качеством: http://gephi.org/toolkit/
До 30 секунд до 2 минут достаточно для компоновки такого графика, в зависимости от вашего устройства.
Вы можете использовать макет ForAtlas или макет Yilan Hu Multilevel.
Для очень больших графиков (+ 50K узлов и 500K ссылок) макет OpenOrd wil
Ответ 4
В коммерческом сценарии вы также можете посмотреть семейство yFiles графических библиотек и библиотек визуализации.
Даже версия JavaScript может выполнять макеты для тысяч узлов и ребер с использованием разных стилей размещения. "Органический" стиль макета - это реализация алгоритма компоновки направленной силы, аналогичной по своей природе той, которая используется в браузере Neo4j. Но есть еще много доступных алгоритмов компоновки, которые могут улучшить визуализацию для определенных типов графических структур и диаграмм. В зависимости от настроек и структуры проблемы некоторые из алгоритмов занимают всего несколько секунд, а более сложные реализации также могут привести ваш движок JavaScript к коленям. Варианты, основанные на Java и .net, по-прежнему намного лучше, на сегодняшний день, но двигатели JavaScript догоняют.
Вы можете играть с этими алгоритмами и настройками в это онлайн-демонстрация.
Отказ от ответственности: я работаю для yWorks, который является создателем этих библиотек, но я не представляю своего работодателя на SO.
Ответ 5
Я бы посмотрел на http://neo4j.org/ свой открытый исходный код, который полезен в вашем случае, чтобы вы могли настроить его под свои нужды. Счет github можно найти здесь.