Используя API-интерфейс Neo4j Java 3.1.0-M08, я построил кратчайший поиск путей с использованием алгоритма Дейкстры. У меня много данных, 28 ГБ на диске. Узлы представляют города, а отношения представляют собой соединения. Как правило, в городе будет очень много соединений. В моем PathExpander
я исключаю большое количество отношений, которое приводит лишь к крошечной части всего пройденного графика. Тем не менее, поиск выполняет ужасно:API-интерфейс Neo4j Java: производительность Bad Dijkstra
Relations traversed: 5343
Duration: ~14s
Performance: 373 relations/s
Это то, что профилирование горячие методы подогреваемым запуска выглядит так:
PathExpander
и CostEvaluator
чтения свойств типа Long
, Integer
и Double
. Я попытался заменить вызовы на getProperty
getAllProperties
, которые не помогли.
Приложение запускается со следующими аргументами JVM: -Xmx10g -Xms10g
. У меня довольно быстрый SSD, и я стараюсь предварительно загружать кеши, прежде чем измерять, запустив один и тот же поиск пару раз. Начиная со второго прогона, я не вижу активности диска, то есть пройденный график должен находиться в ОЗУ.
Я вызываю GraphDatabaseFactory
с аргументами по умолчанию. Могут ли настраиваемые конфигурации повысить производительность? Обратите внимание, что для тестирования я имею только 16 ГБ оперативной памяти.