Neo4J 3.x比Neo4J 2.x使用更多内存?怎么避免呢?

Dmi*_*kin 5 java memory-management neo4j graph-databases

我将我的Graph数据库从Neo4J 2.0.4更新到Neo4J 3.3.3,当我用我的应用程序运行它时,它现在使用的内存java比以前多两倍(我的Mac上的进程).(我在Mac上运行Java 1.8)

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

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

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

log*_*ima 3

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
Run Code Online (Sandbox Code Playgroud)

页面缓存

数据库在磁盘上执行大量 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
Run Code Online (Sandbox Code Playgroud)

索引

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

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

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

$> du -sh data/databases/graph.db/indexes
Run Code Online (Sandbox Code Playgroud)

结论

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

RAM 上的指纹是否更有效,我不知道,我从未做过这样的测试,但现在 RAM 很便宜。

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

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