Neo4j 顺序数据库事务问题
Neo4j sequential db transactions issue
我有一个 Spring Data Neo4j 应用程序,它需要向 Neo4j Community Edition (3.2) 执行批量数据 write/read。
我的系统配置(Macbook pro)
16GB 内存,2.5 GHz 英特尔酷睿 i7。
节点总数:120,000。 (5 每个节点的属性。)
我每个节点有 500 个关系。
以上 nodes/relationships 是应用程序其他部分工作所需的初始数据的一部分。
我使用 Spring Data Neo4j 进行 read/write 交易。每个节点依次建立其对应的 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
}
服务class:
@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 次写入 operations/minute.
几分钟后,写入操作从 1200 显着下降到 100 写入 operations/minute .
后来归结为10写operations/minute.
有谁知道 Neo4j 写操作随时间变慢的根本原因吗?
如果需要更多信息,请告诉我,我们会更新问题。提前致谢!
这是一个非常宽泛的问题,您至少应该分析您的应用程序以确定哪个部分变慢了 - 是 Neo4j 本身吗?具体查询? Spring 数据 Neo4j?你的申请?以后帮到你会更容易。
通常的嫌疑人是:
您的事务太大 - 将负载拆分为 1k 到 50k 元素(节点 + 关系 + 属性)的较小事务 - 这是必需的,因为 Neo4j 在内存中保存事务状态并且它可能花费很多当您有大量事务时,GC 时间(甚至 运行 内存不足)。
增长的 OGM 会话 - 再次导致在 GC 中花费大量时间 - 不时清除会话(这应该在 @Transactional
方法完成时使用 SDN 自动完成)
有一些没有索引的操作会随着数据量的增加而变慢(例如,进行全节点标签扫描而不是使用索引)
Neo4j 或您的应用程序内存不足 - 时间主要花在 GC
SDN/OGM 可能存在性能问题 - 可重现的测试用例对此非常有用。
我有一个 Spring Data Neo4j 应用程序,它需要向 Neo4j Community Edition (3.2) 执行批量数据 write/read。
我的系统配置(Macbook pro) 16GB 内存,2.5 GHz 英特尔酷睿 i7。
节点总数:120,000。 (5 每个节点的属性。)
我每个节点有 500 个关系。
以上 nodes/relationships 是应用程序其他部分工作所需的初始数据的一部分。
我使用 Spring Data Neo4j 进行 read/write 交易。每个节点依次建立其对应的 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
}
服务class:
@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 次写入 operations/minute.
几分钟后,写入操作从 1200 显着下降到 100 写入 operations/minute .
后来归结为10写operations/minute.
有谁知道 Neo4j 写操作随时间变慢的根本原因吗?
如果需要更多信息,请告诉我,我们会更新问题。提前致谢!
这是一个非常宽泛的问题,您至少应该分析您的应用程序以确定哪个部分变慢了 - 是 Neo4j 本身吗?具体查询? Spring 数据 Neo4j?你的申请?以后帮到你会更容易。
通常的嫌疑人是:
您的事务太大 - 将负载拆分为 1k 到 50k 元素(节点 + 关系 + 属性)的较小事务 - 这是必需的,因为 Neo4j 在内存中保存事务状态并且它可能花费很多当您有大量事务时,GC 时间(甚至 运行 内存不足)。
增长的 OGM 会话 - 再次导致在 GC 中花费大量时间 - 不时清除会话(这应该在
@Transactional
方法完成时使用 SDN 自动完成)有一些没有索引的操作会随着数据量的增加而变慢(例如,进行全节点标签扫描而不是使用索引)
Neo4j 或您的应用程序内存不足 - 时间主要花在 GC
SDN/OGM 可能存在性能问题 - 可重现的测试用例对此非常有用。