我有一台Neo4J企业数据库,运行在具有8Gb RAM和80Gb SSD的DigitalOcean VPS上。 Neo4J实例的性能目前很糟糕:
match (n) where n.gram='0gram' AND n.word=~'a.' return n.word LIMIT 5 @ 349ms
match (n) where n.gram='0gram' AND n.word=~'a.*' return n.word LIMIT 25 @ 1588ms
我理解正则表达式很昂贵,但同样在我用任何其他字母替换'a.'
或'a.*'
部分的查询中,Neo4j只是崩溃了。在此之前,我可以看到内存中的大量增加(达到90%),并且CPU飙升。
我的Neo4j填充如下:
Number Of Relationship Type Ids In Use: 1,
Number Of Node Ids In Use: 172412046,
Number Of Relationship Ids In Use: 172219328,
Number Of Property Ids In Use: 344453742
VPS只运行Neo4J(在debian 7 / amd64上)。我使用NUMA + parallelGC标志,因为它们应该更快。我一直在调整我的RAM设置,虽然它现在经常没有崩溃,但我觉得应该有一些收获要做
neostore.nodestore.db.mapped_memory=1024M
neostore.relationshipstore.db.mapped_memory=2048M
neostore.propertystore.db.mapped_memory=6144M
neostore.propertystore.db.strings.mapped_memory=512M
neostore.propertystore.db.arrays.mapped_memory=512M
# caching
cache_type=hpc
node_cache_array_fraction=7
relationship_cache_array_fraction=5
# node_cache_size=3G
# relationship_cache_size=1G --> these throw a not-enough-heap-mem error
数据本质上是一系列树,其中node0
只需要进行全文搜索,以下节点由具有浮点值的属性搜索。
node0 -REL-> node0.1 -REL-> node0.1.1 ... node0.1.1.1.1
\
-REL-> node0.2 -REL-> node0.2.1 ... node0.2.1.1
有aprox。 5.000个顶级节点,如node0
。
我应该重新配置我的内存/缓存使用情况,还是应该添加更多内存?
---编辑索引---
因为节点的所有树都是4层深,所以每个级别都有一个标签可以快速查找。在这种情况下,所有node0
个节点都有一个标签(称为0gram
)。 n.gram='0gram'
应该使用与标签耦合的索引。
---编辑新配置---
我将VPS升级到16Gb。 nodeStore具有2.3Gb(11%),PropertyStore 13.8Gb(64%),SSD上的relastionshipStore达到5.6Gb(26%)。 在此基础上,我创建了一个新的配置(详见上文)。 我正在等待全套查询,并会在同一时间进行一些额外的测试
答案 0 :(得分:5)
是的,你需要创建一个索引,你的标签叫什么?想象一下它被称为:NGram
create index on :NGram(gram);
match (n:NGram) where n.gram='0gram' AND n.word=~'a.' return n.word LIMIT 5
match (n:NGram) where n.gram='0gram' AND n.word=~'a.*' return n.word LIMIT 25
您正在做的不是图搜索,而只是通过全扫描查找+与正则表达式进行属性比较。不是一个非常有效的操作。你需要的是FullTextSearch(新模式索引不支持,但仍然使用旧索引)。
您是否可以运行此查询(在创建索引之后)并说明它返回了多少个节点?
match (n:NGram) where n.gram='0gram' return count(*)
相当于
match (n:NGram {gram:'0gram'}) return count(*)
我几天前写了blog post about it,请仔细阅读,看看它是否适用于您的情况。
你的Neo4j数据库在磁盘上有多大?
配置的堆大小是多少? (在neo4j-wrapper.conf
?)
正如您所看到的,您使用的内存比机器多(甚至不计算操作系统或文件系统缓存)。
所以你必须减少mmio尺寸,例如节点2G用于500s,用于rels,1G用于属性。
查看商店文件大小并相应地设置mmio。
答案 1 :(得分:4)
根据具有n.gram='0gram'
的节点数量,您可以通过在gram
属性上设置标签和索引来获益良多。如果你有这个,索引查找将直接返回所有0gram
个节点,并仅对这些节点应用正则表达式匹配。您当前的语句将从db加载每个节点并检查其属性。