2014-09-22 2 views
4

약 1 천만 개의 노드가 포함 된 Neo4J 그래프를 사용하는 응용 프로그램과 함께 작업하고 있습니다. 매일 실행하는 주요 작업 중 하나는 그래프에 새 노드 또는 업데이트 된 노드를 일괄 적으로 가져 오는 것으로 약 1-2 백만 건의 순서입니다. Cypher 쿼리 언어와 함께 Python 스크립트를 실험 한 후에 더 나은 성능 결과를 얻기 위해 Java API를 사용하여 포함 된 그래프를 제공하기로 결정했습니다.Neo4J 용 Cypher를 사용하여 Java API와 Python 성능 비교

내가 발견 한 것은 기본 Java API를 사용하여 약 5 배 개선 된 것입니다. 나는 최신이라고 믿는 Neo4j 2.1.4를 사용하고 있습니다. 나는 다른 글에서 임베디드 그래프가 조금 더 빠르다고 읽었지만, 가까운 장래에 바뀔 수 있어야한다. 비슷한 결과를 얻은 다른 사람들과 내 결과를 검증하고 싶습니다.

나는 아래의 스 니펫을 사용하여 일반적인 방법을 사용했습니다. 코드가 크게 단순화되었습니다. 사이퍼/파이썬에서

샘플 : 포함 된 그래프에서

cnode = self.graph_db.create(node(hash = obj.hash, 
    name = obj.title, 
    date_created = str(datetime.datetime.now()), 
    date_updated = str(datetime.datetime.now()) 
)) 

샘플은 자바를 사용하여 :

final Node n = Graph.graphDb.createNode(); 
for (final Label label : labels){ 
    n.addLabel(label); 
} 
for (Map.Entry<String, Object> entry : properties.entrySet()) { 
    n.setProperty(entry.getKey(), entry.getValue()); 
} 

당신의 통찰력 주셔서 감사합니다!

답변

4

여기서 실제로하는 것은 두 개의 서로 다른 API의 속도를 비교하는 것입니다. 두 가지 언어 만 사용하면됩니다. 따라서, 당신은 좋아하는 것과 비교하지 않습니다. Python (및 다른 언어)에서 사용하는 Java 핵심 API 및 REST API는 명시 적 대 암시 적 트랜잭션과 같은 다른 관용구를 가지고 있습니다. 또한 REST API와 관련된 네트워크 대기 시간은 큰 차이를 만들 것입니다. 특히 노드 당 하나의 HTTP 호출을 사용하는 경우 더욱 그렇습니다.

좀 더 의미있는 성능 비교를 얻으려면 다음과 같이 비교해야합니다. REST API를 통해 Java를 사용하거나 두 테스트에 Cypher를 사용하십시오.

힌트 1 : 단일 API 호출로 여러 요청을 일괄 처리하여 REST보다 성능이 향상됩니다.

힌트 2 : REST API는 코어 API만큼 빠르지 않을 것입니다. 후자 API는 네이티브이며 이전에는 훨씬 많은 레이어가 있기 때문에 결코 빠르지 않을 것입니다.

0

적절한 성능 측정이 없으면 시간이 어디로 가는지 알기가 어렵습니다. 일반적으로 Python 스크립트는 Java보다 느리지 만 언어가 코드를 작성하는 속도가 빠르기 때문에 개발 속도를 실행 속도에 맞게 조정합니다.

예 : 위의 코드는 Python에서 1 시간, Java에서 12 분이 걸립니다. 파이썬 버전을 작성하는 데 하루가 걸렸으며 자바 버전은 3 일이 걸렸습니다. 즉, 휴식 시간에 도달하려면 최소 2 일/(60 - 12) 분 = 60 번 코드를 실행해야합니다.

물론이 예제는 Python이 작업을 수행하는 데 48 분을 기다려야 만 괜찮습니다. 가져 오기 시간 동안 시스템이 다운되면 60 대 12 분이 큰 차이를 만듭니다 - 아무도 신경 쓰지 않는 밤에는 실행할 수 없다면.

관련 문제