首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neo4J调优还是只是更多的内存?

Neo4J调优还是只是更多的内存?
EN

Stack Overflow用户
提问于 2014-04-09 09:32:37
回答 2查看 719关注 0票数 2

我有一个Neo4J企业数据库,运行在DigitalOcean VPS上,内存为8Gb,SSD为80 8Gb。目前,Neo4J实例的性能非常糟糕:

代码语言:javascript
复制
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

我知道regex很昂贵,但同样地,在用任何其他字母替换'a.''a.*'部件的查询中,Neo4j就会崩溃。在此之前,我可以看到一个巨大的内存积累(接近90%),以及CPU的飞速发展。

我的Neo4j如下所示:

代码语言:javascript
复制
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 64上)。我使用NUMA+parallelGC标志,因为它们应该更快。我一直在调整我的RAM设置,虽然它现在不经常崩溃,但我觉得应该有一些收获

代码语言:javascript
复制
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上只需要全文搜索,下面的节点由带有浮点值的属性搜索。

代码语言:javascript
复制
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层的,所以每个级别都有一个用于快速finding.in的标签--在这种情况下,所有的node0节点都有一个标签(称为0gram)。n.gram='0gram'应该使用与标签相连的索引。

-在新Config上编辑-

我将VPS升级到16 to。nodeStore为2.3Gb (11%),PropertyStore为13.8Gb (64%),relastionshipStore为5.6Gb (26%)。在此基础上,我创建了一个新的配置(详见上文)。我正在等待完整的查询,同时还会进行一些额外的测试

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-09 11:53:30

是的,你需要创建一个索引,你的标签叫什么?想象一下它被称为:NGram

代码语言:javascript
复制
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

您所做的不是图形搜索,而是通过与regexp进行全面扫描+属性比较而进行的查找。不是很有效率的行动。您需要的是FullTextSearch (新模式索引不支持它,但遗留索引仍然支持它)。

您能否运行此查询(在创建索引之后)并说明它返回了多少个节点?

代码语言:javascript
复制
match (n:NGram) where n.gram='0gram' return count(*)

它相当于

代码语言:javascript
复制
match (n:NGram {gram:'0gram'}) return count(*)

我几天前写了一个blog post about it,请阅读它,看看它是否适用于您的情况。

磁盘上的Neo4j数据库有多大?配置的堆大小是多少?(在neo4j-wrapper.conf?)

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

因此,您必须将mmio的大小减少,例如,节点2G用于rels,1G用于属性。

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

票数 5
EN

Stack Overflow用户

发布于 2014-04-09 10:49:46

根据拥有n.gram='0gram'的节点数量,在它们上设置标签和为gram属性建立索引可能会给您带来很大好处。如果这样做,索引查找将直接返回所有0gram节点,并仅在这些节点上应用regex匹配。当前语句将从db加载每个节点并检查其属性。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22958350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档