我有Neo4j的模式非常简单。只有一种类型的节点和一种可以绑定节点的关系。每个节点都有一个属性(索引),每个关系有四个属性。这些是数字:如何为特定任务配置Neo4j
neo4j-sh (?)$ dbinfo -g "Primitive count"
{
"NumberOfNodeIdsInUse":,
"NumberOfPropertyIdsInUse": 109295019,
"NumberOfRelationshipIdsInUse": 44903404,
"NumberOfRelationshipTypeIdsInUse": 1
}
我在Debian,7核心和26GB内存的虚拟机上运行此数据库。这是我的Neo4j配置:
neo4j.properties:
neostore.nodestore.db.mapped_memory=3000M
neostore.relationshipstore.db.mapped_memory=4000M
neostore.propertystore.db.mapped_memory=4000M
neostore.propertystore.db.strings.mapped_memory=300M
neostore.propertystore.db.arrays.mapped_memory=300M
的Neo4j-wrapper.conf:
wrapper.java.additional=-XX:+UseParallelGC
#wrapper.java.additional=-XX:+UseConcMarkSweepGC
wrapper.java.additional=-XX:+CMSClassUnloadingEnabled
wrapper.java.initmemory=2000
wrapper.java.maxmemory=10000
我使用UseParallelGC代替UseConcMarkSweepGC,因为我注意到,与UseConcMarkSweepGC只有一个CPU核心在查询过程中使用,当我更改为UseParallelGC时,所有核心都已使用。我不会并行运行任何查询。只有一个在Neo4j的壳一时间,但大多是有关整个节点集例如:
match (n:User)-->(k:User)
return n.id, count(k) as degree
order by degree desc limit 100;
,它需要726230毫秒去执行它。我也试过:
match (n:User)-->()-->(k:User)
return n.id, count(DISTINCT k) as degree
order by degree desc limit 100;
,但很长一段时间我只得到后“错误发生在服务器线程;嵌套例外是: java.lang.OutOfMemoryError:GC开销超过限制”。我没有考虑考虑关系属性的限制查询,但它也是计划的。 我认为我的配置不是最佳的。我注意到Neo4j在查询期间最多使用50%的系统内存,剩余的内存空闲。我可以通过在wrapper.java.maxmemory中设置更大的值来改变这一点,但我已经读过,我必须为mapped_memory设置留下一些内存。但是,我不确定是否将它们考虑在内,因为在查询期间存在大量可用内存。我应该如何设置这些查询的配置?
我知道我的查询消耗了大量的CPU和内存。但是,我的图形模型已经被优化,因为我没有将两个用户之间的每个通信事件存储为单独的关系。相反,我把它们聚合成一个关系,所以两个用户之间至多有两个关系。一个用于传出通信事件,另一个用于传入。在我的使用情况下,存储财产的程度将无济于事。我想调整我的配置的原因是,即使在这样的消费查询期间,我仍然有大约10GB的可用内存。 – Cob 2014-09-04 07:25:55
另一种方法可能是使用Neo4j的Java API将该查询重构为非托管扩展。对于非托管扩展,我已经取得了一些很好的经验,与cypher esp相比显着更快。对于大型查询,请参阅docs.neo4j.org/chunked/stable/server-unmanaged-extensions.html – 2014-09-04 07:39:16