2016-09-16 25 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

PathExpanderCostEvaluator閱讀Long類型,Integer的性質和Double。我試圖用getAllProperties替換getProperty的呼叫,但沒有幫助。

該應用程序使用以下JVM參數啓動:-Xmx10g -Xms10g。我有一個相當快速的固態硬盤,並且確保在測量之前通過運行相同的搜索幾次來預加載高速緩存。從第二次運行開始,我看不到磁盤活動,這意味着遍歷的圖應該在RAM中。

我使用默認參數調用GraphDatabaseFactory。定製配置可以提高性能嗎?請注意,我只有16 GB RAM用於測試目的。

回答

0

問題是每個城市節點都連接到了很高的連接關係。儘管很多關係被排除在外,爲了排除它們,每一個關係都必須被閱讀。解決方案是改變模型。新的模型如下所示:

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

因爲在某一天只接可以考慮,在不同的日子所有的連接都沒有碰過。