gpt4 book ai didi

performance - Neo4J 调优还是更多 RAM?

转载 作者:行者123 更新时间:2023-12-01 08:23:51 27 4
gpt4 key购买 nike

我有一个 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+parallelGcflags,因为它们应该更快。我一直在调整我的 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

大约有。 5.000 个顶级节点,例如 node0

我应该重新配置我的内存/缓存使用情况,还是应该添加更多 RAM?

--- 编辑索引---

因为所有树的节点总是 4 层深,每个级别都有一个标签以便快速查找。在这种情况下,所有 node0 节点都有一个标签(称为 0gram ). n.gram='0gram' 应该使用与标签耦合的索引。

--- 编辑新配置---

我将 VPS 升级到 16Gb。 SSD 上的 nodeStore 有 2.3Gb (11%),PropertyStore 有 13.8Gb (64%),relationshipStore 有 5.6Gb (26%)。在此基础上我创建了一个新的配置(详见上文)。我正在等待全套查询,同时会做一些额外的测试

最佳答案

是的,你需要创建一个索引,你的标签叫什么?想象一下它被称为 :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 中?)

如您所见,您使用的 RAM 比您机器的内存还多(甚至不包括操作系统或文件系统缓存)。

所以你必须减少 mmio 大小,例如节点为 500M,rels 为 2G,属性为 1G。

查看您的存储文件大小并相应地设置 mmio。

关于performance - Neo4J 调优还是更多 RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22958350/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com