我有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