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 是高度可配置的,所以如果您有一个小型服务器并且想要微调内存消耗,您必须设置堆和页面缓存大小。
我将我的图形数据库从 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 是高度可配置的,所以如果您有一个小型服务器并且想要微调内存消耗,您必须设置堆和页面缓存大小。