我嘗試使用neo4j做一些關於SNS的實驗。我創建了一個由100萬個用戶組成的隨機圖表,10萬個項目,每個用戶有大約100個朋友和100個最喜歡的項目。所以圖中有大約100萬個節點和2億個關係,圖形文件佔用4.8GB。所有節點只有一個ID,我爲它們創建了索引。 現在我已經使用Java API來設置一個小型集羣來維護這個由三個虛擬機組成的圖。每個VM有16GB ram,Intel Xeon CPU 2.00GHz(8核心)。以下是一些配置:如何配置使neo4j更快?
config.put("neostore.nodestore.db.mapped_memory", "150M");
config.put("neostore.relationshipstore.db.mapped_memory", "5G");
config.put("neostore.propertystore.db.mapped_memory", "100M");
config.put("neostore.propertystore.db.strings.mapped_memory", "130M");
config.put("neostore.propertystore.db.arrays.mapped_memory", "130M");
config.put("node_auto_indexing", "true");
config.put("use_memory_mapped_buffers", "true");
config.put("neostore.propertystore.db.index.keys.mapped_memory", "150M");
config.put("neostore.propertystore.db.index.mapped_memory", "150M");
我使用gcr cache_type。我只是通過遍歷熱身圖:
for (Node n : GlobalGraphOperations.at(db).getAllNodes()) {
n.getPropertyKeys();
for (Relationship relationship : n.getRelationships()) {
start = relationship.getStartNode();
}
}
Cypher支架查詢:
start user=node:users({key}={value}) match user-[:FRIEND]->(friend)-[:LIKES]->(item) return item, collect(friend), count(0) order by count(0) desc limit 32;
,這意味着找出一個人的朋友的喜愛的物品。 我運行命令的jar:java -d64 -server -XX:+UseConcMarkSweepGC -XX:+UseNUMA -Xms10752m -Xmx10752m -Xmn2688m -jar Neo4J-1.0-SNAPSHOT.jar
現在,我的實驗結果: (1)單個線程 每個查詢的費用平均約70毫秒。 (2)8線程 每個查詢平均花費約160毫秒,許多查詢花費超過500毫秒。 RPS約爲50 /秒。
我想提高性能,但不知道如何。看來內存不足以保存所有數據,是嗎? 此外,我已經嘗試過軟和強大的cache_type,並且當它變熱時,內存很快就會滿了。
請幫助我,教我如何改善它。 非常感謝。
我試過遍歷API,它確實效果更好。現在,每個查詢花費約40毫秒。但是當我使用多線程(如8線程)時,一次查詢的平均時間大約需要200毫秒。有16個內核,我不知道如何改進這個以獲得更高的RPS。謝謝! – GameBoy