Neo4j顺序数据库事务问题
我有一个SpringDataNeo4j应用程序,需要对Neo4j社区版(3.2)进行批量数据写入/读取 我的系统配置(Macbook pro) 16GB内存,2.5GHz Intel Core i7 节点总数:120000。(5每个节点中的属性。) 我每个节点有500个关系 以上节点/关系是应用程序其他部分工作所需的初始数据的一部分 我使用Spring数据Neo4j进行读/写事务。每个节点按顺序构建其对应的500个关系。因此,显然,构建上述所有节点和关系需要大量时间 示例代码: 实体:Neo4j顺序数据库事务问题,neo4j,spring-data-neo4j,Neo4j,Spring Data Neo4j,我有一个SpringDataNeo4j应用程序,需要对Neo4j社区版(3.2)进行批量数据写入/读取 我的系统配置(Macbook pro) 16GB内存,2.5GHz Intel Core i7 节点总数:120000。(5每个节点中的属性。) 我每个节点有500个关系 以上节点/关系是应用程序其他部分工作所需的初始数据的一部分 我使用Spring数据Neo4j进行读/写事务。每个节点按顺序构建其对应的500个关系。因此,显然,构建上述所有节点和关系需要大量时间 示例代码: 实体: //Ne
//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...
}
//Neo4j实体类
导入org.neo4j.ogm.annotation.GraphId;
导入org.neo4j.ogm.annotation.NodeEntity;
导入org.neo4j.ogm.annotation.Relationship;
@节点性
公共类SamplePojo{
@格拉希德
公共长id;
私有字符串属性1;
私有字符串属性2;
私有整数属性3;
私人双重财产4;
私有整数属性5;
@关系(type=“has\u sample\u Relationship”,direction=“OUTGOING”)
List sampleList=new ArrayList();
//接球手和接球手。。。
}
存储库:
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.GraphRepository;
@Repository
public interface SamplePojoRepository extends GraphRepository<SamplePojo> {
//save
}
import org.springframework.data.neo4j.annotation.Query;
导入org.springframework.data.neo4j.repository.graphresposition;
@存储库
公共接口SamplePojoRepository扩展了GraphRespository{
//拯救
}
服务类别:
@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
}
}
}
@服务
公共类数据插入{
@自动连线
样本库;
公共书写工具4J(列表pojoList){
for(SamplePojo p:pojoList){
//循环遍历100000多个具有属性集和关系的对象
repository.save();//保存到neo4j数据库
}
}
}
我的观察:
最初,,
最初几分钟,每分钟执行1200次写入操作
几分钟后,写入操作从1200显著下降到100次写入操作/分钟
后来,它下降到每分钟10次写操作
有人知道为什么Neo4j写操作会随着时间的推移而变慢这个问题的根本原因吗
如果需要更多信息,请告知我,我将更新问题。提前谢谢 这是一个非常宽泛的问题,您至少应该分析一下您的应用程序,以确定哪个部分的速度变慢了—是Neo4j本身吗?具体问题?弹簧数据Neo4j?你的申请?这样就更容易帮助你了 通常的嫌疑犯是:
- 您的事务太大-将负载拆分为1k到50k个元素(节点+关系+属性)的较小事务-这是必需的,因为Neo4j将事务状态保存在内存中,并且当您有大型事务时,它可能在GC中花费太多时间(甚至耗尽内存)
- 不断增长的OGM会话-再次导致在GC中花费大量时间-不时清除会话(当
方法完成时,应使用SDN自动完成此操作)@Transactional
- 有些没有索引的操作会随着数据量的增加而变慢(例如,执行完整节点标签扫描而不是使用索引)
- Neo4j或您的应用程序内存不足-时间主要花在GC上
- SDN/OGM可能存在性能问题-一个可复制的测试用例将非常适合这一点
- 您的事务太大—将负载拆分为1k到50k元素(节点+关系+属性)的较小事务-这是需要的,因为Neo4j在内存中保留事务状态,当您有大型事务时,它可能会在GC中花费大量时间(甚至耗尽内存)
- 不断增长的OGM会话-再次导致在GC中花费大量时间-不时清除会话(当
方法完成时,应使用SDN自动完成此操作)@Transactional
- 有些没有索引的操作会随着数据量的增加而变慢(例如,执行完整节点标签扫描而不是使用索引)
- Neo4j或您的应用程序内存不足-时间主要花在GC上
- SDN/OGM可能存在性能问题-一个可复制的测试用例将非常适合这一点
@Transactional
注释,所以我猜事务太大了-将列表拆分并按1k大小批量保存感谢回复!更新了我的问题。@TanmayDelhikar我没有看到任何@Transactional
注释,所以我猜事务太大了-将列表拆分并按1k大小批量保存