2016-07-24 36 views
1

我想用最新的彈簧數據neo4j 4測試插入速度。 我修改了電影的例子,使事情變得簡單和可比。在這個例子中,爲什麼neo4j的插入速度如此之低?

嘗試運行測試類: movies.spring.data.neo4j.repositories.PersonRepositoryTest在這裏。

在本例中需要5秒添加400個節點。 https://github.com/fodon/neo4j-spring-data-speed-demo

這是與舊版本的Neo4j https://github.com/fodon/gs-accessing-data-neo4j-speed

的hello.Application類是約40倍比彈簧數據的Neo4j-4更快同樣的工作速度測試。

爲什麼spring-data-neo4j-4比舊版本慢? 它如何加速?

+0

你比較SDN 3遠程或嵌入 – Luanne

+0

既是一個?重新嵌入。 – fodon

回答

5

save()的調用實際上是對數據庫的直接請求請求。目前沒有推遲save()調用的概念。

通過添加一個logback-test.xml文件到您的測試資源打開查詢日誌記錄:

<?xml version="1.0" encoding="UTF-8"?> 

<configuration> 

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder> 
      <pattern>%d %5p %40.40c:%4L - %m%n</pattern> 
     </encoder> 
    </appender> 

    <logger name="org.neo4j.ogm" level="info" /> 


    <root level="info"> 
     <appender-ref ref="console" /> 
    </root> 

</configuration> 

你可以看到,每個Person.save()它實際上使3個請求:

  • 1用於保存車對象
  • 1用於保存Person對象
  • 1用於創建關係

-

2016-07-25 05:27:51,093 INFO drivers.embedded.request.EmbeddedRequest: 155 - Request: UNWIND {rows} as row CREATE (n:`Car`) SET n=row.props RETURN row.nodeRef as nodeRef, ID(n) as nodeId with params {rows=[{nodeRef=-590487524, props={type=f27dc1bac12a480}}, {nodeRef=-1760792732, props={type=41ff5d3a69b4a5b4}}, {nodeRef=-637840556, props={type=3e7e77ca5e406a21}}]} 
2016-07-25 05:27:54,117 INFO drivers.embedded.request.EmbeddedRequest: 155 - Request: UNWIND {rows} as row CREATE (n:`Person`) SET n=row.props RETURN row.nodeRef as nodeRef, ID(n) as nodeId with params {rows=[{nodeRef=-1446435394, props={name=bafd7ad2721516f8}}]} 
2016-07-25 05:27:54,178 INFO drivers.embedded.request.EmbeddedRequest: 155 - Request: UNWIND {rows} as row MATCH (startNode) WHERE ID(startNode) = row.startNodeId MATCH (endNode) WHERE ID(endNode) = row.endNodeId MERGE (startNode)-[rel:`HAS`]->(endNode) RETURN row.relRef as relRefId, ID(rel) as relId with params {rows=[{startNodeId=3, relRef=-712176789, endNodeId=0}, {startNodeId=3, relRef=-821487247, endNodeId=1}, {startNodeId=3, relRef=-31523689, endNodeId=2}]} 

的表現會更好,如果不是爲個人創造的聲明根本就不把參數同時使用了100人,而同爲汽車的對象。

截至目前沒有提供原生的開箱功能在OGM(打開問題:https://github.com/neo4j/neo4j-ogm/issues/208

但是,您可以通過saving一個集合,而不是一個批次它們由一個:

@Test 
@DirtiesContext 
public void speedTest2() { 
    SessionFactory sessionFactory = new SessionFactory("hello.neo.domain"); 
    Session session = sessionFactory.openSession(); 
    Random rand = new Random(10); 
    System.out.println("Before linking up with Neo4j..."); 
    long start = System.currentTimeMillis(); 
    long mark = start; 
    for (int j = 0; j < 10; j++) { 
     List<Person> batch = new ArrayList<>(); 
     for (int i = 0; i < 100; i++) { 
      Person greg = new Person(rand); 
      batch.add(greg); 
     } 
     session.save(batch); 
     long now = System.currentTimeMillis(); 
     System.out.format("%d : Time:%d\n", j, now - mark); 
     mark = now; 
    } 
} 

你可以看到的結果差別非常令人印象深刻:

Not initialzing DB. 
Before linking up with Neo4j... 
0 : Time:7318 
1 : Time:1731 
2 : Time:1555 
3 : Time:1481 
4 : Time:1237 
5 : Time:1176 
6 : Time:1101 
7 : Time:1094 
8 : Time:1114 
9 : Time:1015 
Not initialzing DB. 
Before linking up with Neo4j... 
0 : Time:494 
1 : Time:272 
2 : Time:230 
3 : Time:442 
4 : Time:320 
5 : Time:247 
6 : Time:284 
7 : Time:288 
8 : Time:366 
9 : Time:222 
+0

現在插入時間不是線性的。 0:時間:8764 1:時間:3838 2:時間:3508 3:時間:4578 4:時間:4752 5:時間:6474 6:時間:7589 7:時間:8661 8:時間:9376 9:時間:12910 – fodon

+0

僅供參考,我在比較1000個節點批次的性能。僅供參考,對於舊版本的插入時間爲:0:時間:2863 1:時間:1049 2:時間:780 3:時間:814 4:時間:723 5:時間:762 6 :時間:721 7:時間:474 8:時間:575 9:時間:557 – fodon

+0

爲了完整起見,對於10批10k個節點,每個批次與舊版本的平均插入時間爲4.4s。用spring-data-neo4j-4可以獲得這個速度嗎? – fodon

相關問題