2016-09-16 6 views
1

Neo4jのJava APIバージョン3.1.0-M08を使用して、Dijkstraアルゴリズムを使用して最短経路探索を構築しました。私は28 GBのディスク上に多くのデータを持っています。ノードは都市を表し、リレーションは接続を表します。通常、都市は非常に多くの接続を持つことになります。私のPathExpanderでは、多数のリレーションシップを除外しているため、グラフ全体のわずかな部分しかトラバースされません。それにもかかわらず、検索がひどく実行します。Neo4j Java API:Bad Dijkstraの性能

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

これは、ウォームアップ走行がどのように見えるのホットメソッドプロファイリングものです:

enter image description here

PathExpanderとタイプLongCostEvaluator読み取りプロパティを、IntegerDouble。私はgetPropertyへの呼び出しをgetAllPropertiesに置き換えようとしたが役に立たなかった。

このアプリは、次のJVM引数で起動されます:-Xmx10g -Xms10g。私はかなり速いSSDを持っており、同じ検索を数回実行して測定する前にキャッシュをあらかじめロードするようにしています。 2回目の実行からは、ディスクのアクティビティは表示されません。これは、横断グラフがRAM内にあることを意味します。

私はGraphDatabaseFactoryをデフォルトの引数で呼び出します。カスタム構成でパフォーマンスが向上する可能性はありますか?テスト目的では16 GBのRAMしか持たないことに注意してください。

答えて

0

問題はすべての都市ノードが非常に高い接続関係に接続されていたことでした。多くの関係が除外されていても、それらを除外するためには、すべての人が読まれなければならなかった。解決策は、モデルを変更することでした。新しいモデルは次のようになります。

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

特定の日の接続のみが考慮されるため、異なる日のすべての接続には決して触れません。