2016-09-16 3 views
1

Neo4j의 Java API 버전 3.1.0-M08을 사용하여 Dijkstra 알고리즘을 사용하여 최단 경로 검색을 구축했습니다. 디스크에 28GB의 많은 데이터가 있습니다. 노드는 도시를 나타내고 관계는 연결을 나타냅니다. 일반적으로 도시에는 아주 많은 수의 연결이 있습니다. 내 PathExpander에서 나는 전체 그래프의 극히 일부분 만 통과하는 많은 수의 관계를 배제합니다. 그럼에도 불구하고, 검색 지독하게 수행Neo4j Java API : 불량 다이크 스트라 성능

enter image description here

가와 CostEvaluator 유형 Long, Integer의 속성을 읽고 PathExpander :

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

이 같은 예열 실행의 뜨거운 방법이 보인다 프로파일 무엇인가 Double. 전화를 getProperty으로 바꾸고, 도움이되지 않은 getAllProperties으로 바꾸려고했습니다.

응용 프로그램은 다음 JVM 인수로 실행됩니다 : -Xmx10g -Xms10g. SSD가 상당히 빠르며 동일한 검색을 두 번 실행하여 측정하기 전에 캐시를 미리로드해야합니다. 두 번째 실행부터는 디스크 활동이 표시되지 않습니다. 즉, 가로 이동 된 그래프가 RAM에 있어야합니다.

나는 기본 인수를 사용하여 GraphDatabaseFactory을 호출합니다. 사용자 지정 구성으로 성능이 향상 될 수 있습니까? 테스트 용으로 16GB RAM 만 있습니다.

답변

0

문제는 모든 도시 노드가 매우 많은 양의 연결 관계에 연결되어 있다는 것이 었습니다. 비록 많은 관계가 배제되었지만 그들을 배제하기 위해서 모든 사람이 읽혀 져야했습니다. 해결책은 모델을 변경하는 것이 었습니다. 특정 일에 연결 만이 고려 될 수 있기 때문에

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

, 다른 일에 모든 연결은 건드리지 않습니다 다음과 같이 새로운 모델 보인다.