我将我的图形数据库从Neo4J 2.0.4更新到了Neo4J 3.3.3,当我在我的应用程序中运行它时,它现在使用的内存(我的Mac机上的java进程)是以前的两倍。(我在我的Mac上运行Java 1.8 )
当我启动Neo4J 2时,对于相同的任务和查询,它使用了大约250Mb。但是Neo4J 3使用了大约500Mb。
我以为更新应该更有效率?
有什么可能的方法可以减少内存使用量?
发布于 2018-02-24 18:58:31
Neo4j是基于JVM虚拟机的,它的内存消耗取决于堆的大小。
如果您还没有配置它的大小,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中。
这可以在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中配置这个内存大小,但是有了3的规则,它很容易计算(服务器RAM =堆+页面缓存+索引+操作系统的一些空闲内存)。
您可以使用以下命令计算索引的大小:
$> du -sh data/databases/graph.db/indexes结论
从Neo4j 2开始,有很多改进(功能,性能),所以它确实更高效。
关于RAM上的指纹更有效,我不知道,我从来没有做过这样的测试,但是RAM现在很便宜。
我能告诉你的唯一一件事是,你需要一个较小的堆,数据缓存现在已经脱离了堆。在2.X中,Neo4j在内存中保存了一个图形,以便快速访问。
但是Neo4j是高度可配置的,所以如果你有一个很小的服务器,并且想要微调内存消耗,你必须设置堆和页面缓存大小。
https://stackoverflow.com/questions/48882553
复制相似问题