我有一个Spring Data Neo4j应用程序需要对Neo4j Community Edition(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次写入操作/分钟 。< / p>
之后,它归结为 10次写入操作/分钟 。
有没有人知道为什么Neo4j写入操作会随着时间的推移而减慢的根本原因?
如果需要其他信息,请告知我们,我们会更新问题。提前谢谢!
答案 0 :(得分:5)
这是一个非常广泛的问题,您至少应该对您的应用程序进行分析,以确定哪个部分减速 - 这是Neo4j本身吗?具体查询? Spring Data Neo4j?你的申请?然后它会更容易帮助你。
通常的嫌疑人是:
您的事务太大 - 将负载拆分为1k到50k元素(节点+关系+属性)的较小事务 - 这是必需的,因为Neo4j在内存中保存事务状态并且可能在GC中花费了很长时间(当你有大笔交易时,甚至会耗尽内存。
不断增长的OGM会话 - 再次导致花费大量时间在GC上 - 不时清除会话(这应该在@Transactional
方法完成时自动使用SDN完成)
有一些操作没有索引随着数据量的增加而变慢(例如,执行完整节点标签扫描而不是使用索引)
Neo4j或您的应用程序的内存不足 - 主要用于GC的时间
SDN / OGM可能存在性能问题 - 可重现的测试用例对此非常有用。