Neo4J 3.x 使用的内存比 Neo4J 2.x 多?如何避免这种情况?

Neo4J 3.x using more memory than Neo4J 2.x? How to avoid that?

我将我的图形数据库从 Neo4J 2.0.4 更新到 Neo4J 3.3.3,当我 运行 它与我的应用程序一起使用时,它现在使用了两倍的内存(我的 [=22] 上的 java 进程=]) 比以前。 (我 运行 Java 1.8 我的 Mac)

当我启动 Neo4J 2 时,它使用大约 250Mb 来执行相同的任务和查询。但是 Neo4J 3 使用大约 500Mb。

我认为更新应该更有效率?

减少内存使用的可能方法是什么?

Neo4j基于JVM,其内存消耗取决于Heap的大小。

如果你没有配置它的大小,Neo4j 有一个启发式来计算它,而这个启发式已经改变了。

在Neo4j中3.X,有3个内存空间:

JVM 堆

堆用于存储所有事务的数据,节点和关系上的锁,以及缓存查询的执行计划。

您可以在 conf/neo4j.conf 中配置它的大小:

# Java Heap Size: by default the Java heap size is dynamically
# calculated based on available system resources.
# Uncomment these lines to set specific initial and maximum
# heap size.
dbms.memory.heap.initial_size=512m
dbms.memory.heap.max_size=512m

页面缓存

数据库在磁盘上执行大量 IO。为了快速,它需要将数据放入 RAM。 Neo4j 3.X 使用页面缓存机制来做到这一点,该机制将其二进制数据文件的某些部分放入 RAM 中。所以您最常用的数据都在 RAM 中。

这可以在conf/neo4j.conf中配置:

# The default page cache memory assumes the machine is dedicated to running
 # Neo4j, and is heuristically set to 50% of RAM minus the max Java heap size.
dbms.memory.pagecache.size=10g

索引

索引用于为您的查询快速查找节点,但如果这些索引不在 RAM 中,它们会很慢。

无法在 Neo4j 中配置此内存大小,但使用三的规则很容易计算(服务器 RAM = 堆 + 页面缓存 + 索引 + OS 的一些可用内存)。

您可以使用此命令计算索引的大小:

$> du -sh data/databases/graph.db/indexes

结论

自 Neo4j 2 以来,有很多改进(功能、性能),所以是的,它更有效率。

RAM上的指纹效率更高,我不知道,我从来没有做过这样的测试,但现在RAM很便宜。

我唯一能告诉你的是你应该需要一个较小的堆,数据缓存现在不在堆上。在 2.X 中,Neo4j 在内存中保留了一个图形以便快速访问。

但是 Neo4j 是高度可配置的,所以如果您有一个小型服务器并且想要微调内存消耗,您必须设置堆和页面缓存大小。