我有一个Neo4J企业数据库,运行在DigitalOcean VPS上,内存为8Gb,SSD为80 8Gb。目前,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我知道regex很昂贵,但同样地,在用任何其他字母替换'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: 344453742VPS只运行Neo4J (在debian 7/amd64 64上)。我使用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有阿普罗克斯。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%)。在此基础上,我创建了一个新的配置(详见上文)。我正在等待完整的查询,同时还会进行一些额外的测试
发布于 2014-04-09 11:53:30
是的,你需要创建一个索引,你的标签叫什么?想象一下它被称为: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您所做的不是图形搜索,而是通过与regexp进行全面扫描+属性比较而进行的查找。不是很有效率的行动。您需要的是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比机器拥有的内存还多(甚至不包括OS或文件系统缓存)。
因此,您必须将mmio的大小减少,例如,节点2G用于rels,1G用于属性。
查看您的存储文件大小,并相应地设置mmio。
发布于 2014-04-09 10:49:46
根据拥有n.gram='0gram'的节点数量,在它们上设置标签和为gram属性建立索引可能会给您带来很大好处。如果这样做,索引查找将直接返回所有0gram节点,并仅在这些节点上应用regex匹配。当前语句将从db加载每个节点并检查其属性。
https://stackoverflow.com/questions/22958350
复制相似问题