2016-09-16 15 views
1

Используя API-интерфейс Neo4j Java 3.1.0-M08, я построил кратчайший поиск путей с использованием алгоритма Дейкстры. У меня много данных, 28 ГБ на диске. Узлы представляют города, а отношения представляют собой соединения. Как правило, в городе будет очень много соединений. В моем PathExpander я исключаю большое количество отношений, которое приводит лишь к крошечной части всего пройденного графика. Тем не менее, поиск выполняет ужасно:API-интерфейс Neo4j Java: производительность Bad Dijkstra

Relations traversed: 5343 
Duration: ~14s 
Performance: 373 relations/s 

Это то, что профилирование горячие методы подогреваемым запуска выглядит так:

enter image description here

PathExpander и CostEvaluator чтения свойств типа Long, Integer и Double. Я попытался заменить вызовы на getPropertygetAllProperties, которые не помогли.

Приложение запускается со следующими аргументами JVM: -Xmx10g -Xms10g. У меня довольно быстрый SSD, и я стараюсь предварительно загружать кеши, прежде чем измерять, запустив один и тот же поиск пару раз. Начиная со второго прогона, я не вижу активности диска, то есть пройденный график должен находиться в ОЗУ.

Я вызываю GraphDatabaseFactory с аргументами по умолчанию. Могут ли настраиваемые конфигурации повысить производительность? Обратите внимание, что для тестирования я имею только 16 ГБ оперативной памяти.

ответ

0

Проблема заключалась в том, что каждый узел города был связан с очень большим количеством отношений соединения. Несмотря на то, что многие отношения были исключены, чтобы их исключить, каждый из них должен был быть прочитан. Решением было изменение модели. Новая модель выглядит следующим образом:

(:City)-[:ConnectionDay {day: {day}}]->(:ConnectionDay)-[:Connection]->(:City) 

Поскольку только соединения на определенный день можно считать, все соединения в разные дни никогда не трогали.

 Смежные вопросы

  • Нет связанных вопросов^_^