2017-06-22 29 views
1

我有一個Spring Data Neo4j應用程序需要對Neo4j Community Edition(3.2)進行批量數據寫/讀操作。Neo4j連續數據庫事務處理問題

我的系統配置(Macbook pro) 16GB RAM,2.5 GHz Intel Core i7。

節點總數:120,000。 (屬性中的每個節點。)

我有每個節點關係。

上面的節點/關係是初始數據的一部分,我需要爲應用程序的其他部分工作。

我使用Spring Data Neo4j進行讀寫事務。每個節點依次構建其相應的500個關係。顯然,構建所有以上節點和關係需要大量時間。

示例代碼:

實體:

//Neo4j entity class 
import org.neo4j.ogm.annotation.GraphId; 
import org.neo4j.ogm.annotation.NodeEntity; 
import org.neo4j.ogm.annotation.Relationship; 

@NodeEntity 
public class SamplePojo { 

@GraphId 
    public Long id; 
    private String property1; 
    private String property2; 
    private Integer property3; 
    private Double property4; 
    private Integer property5; 

@Relationship(type="has_sample_relationship",direction="OUTGOING") 
    List<SamplePojo> sampleList = new ArrayList<>(); 

//Getters and setters... 

} 

庫:

import org.springframework.data.neo4j.annotation.Query; 
import org.springframework.data.neo4j.repository.GraphRepository; 

@Repository 
public interface SamplePojoRepository extends GraphRepository<SamplePojo> { 

//save 

} 

服務類:

@Service 
    public class DataInsertion{ 

    @Autowired 
    SamplePojoRepository repository; 


    public writeToNeo4j(List<SamplePojo> pojoList){ 

    for(SamplePojo p : pojoList){ 

    // Loop through more than 100,000 objects that have properties set and relationships as well 

    repository.save(); // save to neo4j db 

    } 
} 
    } 

我的觀察:

最初, 前幾分鐘,花了1200寫入操作/分鐘

幾分鐘後,寫操作下來顯著從100次寫操作/分鐘

後來,它來到了10次寫操作/分鐘

有沒有人知道爲什麼Neo4j寫操作時間減慢問題的根本原因?

請讓我知道是否需要額外的信息,將更新問題。提前致謝!

+0

我已閱讀:https://stackoverflow.com/questions/19589687/neo4j-inserting-7k-nodes-is-slow-spring-data-neo4j-springrestgraphdatabase?rq=1但沒有一個答案准確解釋它爲什麼會發生。 –

回答

5

這是一個非常寬泛的問題,您至少應該描述您的應用程序以確定哪些部分會變慢 - 是Neo4j本身嗎?具體查詢? Spring Data Neo4j?你的申請?那麼幫助你會更容易。

通常嫌疑人:

  • 您的交易是太大 - 拆分負載爲1K到50K元素(節點+關係+屬性)的小交易 - 這是必要的,因爲Neo4j的在內存中保存交易狀態當你有很大的交易時,它可能花費很多時間在GC(甚至耗盡內存)。

  • 增長OGM會議 - 這也會造成在GC上花費的大量時間 - 從時間清除會話時間(這應該自動SDN完成時@Transactional方法結束)

  • 有一些操作沒有這成爲與不斷增長的數據量(例如,在做完整的節點標籤掃描而不是使用索引)

  • 低內存Neo4j的或應用程序的速度指標 - 時間主要花費在GC

  • 有可能是一個PERF SDN/OGM的性能問題 - 可重複的測試案例對此非常重要。

+0

感謝您的回覆!更新我的問題。 –

+0

@TanmayDelhikar我沒有看到任何'@ Transactional'註釋,所以我的猜測是交易太大 - 拆分列表並將其保存爲1k大小的批次 –