【问题标题】:Neo4j sequential db transactions issueNeo4j 顺序数据库事务问题
【发布时间】:2017-06-23 15:32:45
【问题描述】:

我有一个 Spring Data Neo4j 应用程序,需要对 Neo4j 社区版 (3.2) 进行批量数据写入/读取。

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

节点总数:120,000。 (5 个属性在每个节点中。)

每个节点我有 500 个关系。

以上节点/关系是我需要应用程序的其他部分工作的初始数据的一部分。

我使用 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 次写入操作/分钟

几分钟后,写入操作从 1200 显着下降到 100 个写入操作/分钟

后来,它降至 10 次写入操作/分钟

有人知道为什么 Neo4j 写入操作会随着时间变慢的根本原因吗?

如果需要更多信息,请告诉我,我们会更新问题。提前致谢!

【问题讨论】:

标签: neo4j spring-data-neo4j


【解决方案1】:

这是一个非常广泛的问题,您至少应该分析您的应用程序以确定哪个部分变慢 - 是 Neo4j 本身吗?具体查询?春天数据 Neo4j?你的申请?那么帮助你会更容易。

通常的嫌疑人是:

    1234563甚至内存不足)当您有大量事务时。
  • 增长的 OGM 会话 - 再次导致在 GC 中花费大量时间 - 不时清除会话(这应该在 @Transactional 方法完成时使用 SDN 自动完成)

  • 有一些没有索引的操作会随着数据量的增加而变慢(例如,进行全节点标签扫描而不是使用索引)

  • Neo4j 或您的应用程序内存不足 - 时间主要花在 GC 上

  • SDN/OGM 可能存在性能问题 - 可重现的测试用例对此非常有用。

【讨论】:

  • 感谢您的回复!更新了我的问题。
  • @TanmayDelhikar 我没有看到任何 @Transactional 注释,所以我的猜测是事务太大 - 拆分列表并按 1k 大小批量保存
猜你喜欢
  • 2014-06-02
  • 2010-12-24
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 2015-08-27
相关资源
最近更新 更多