Java 对于嵌入式数据库,数据库是否加载到neo4j中的主存?

Java 对于嵌入式数据库,数据库是否加载到neo4j中的主存?,java,hadoop,neo4j,Java,Hadoop,Neo4j,我试图解析一个大文件,并在Neo4JDB中为它创建节点。我使用map reduce,因此为每个reduce调用加载以下行 GraphDatabaseService db = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH); 现在,这一行在运行一段时间后给出了以下异常- java.lang.OutOfMemoryError: GC overhead limit exceeded at org.neo4j.io.pageca

我试图解析一个大文件,并在Neo4JDB中为它创建节点。我使用map reduce,因此为每个reduce调用加载以下行

 GraphDatabaseService db = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);
现在,这一行在运行一段时间后给出了以下异常-

java.lang.OutOfMemoryError: GC overhead limit exceeded
    at org.neo4j.io.pagecache.impl.muninn.MuninnPageCache.<init>(MuninnPageCache.java:230)
    at org.neo4j.kernel.impl.pagecache.ConfiguringPageCacheFactory.createPageCache(ConfiguringPageCacheFactory.java:63)
    at org.neo4j.kernel.impl.pagecache.ConfiguringPageCacheFactory.getOrCreatePageCache(ConfiguringPageCacheFactory.java:56)
    at org.neo4j.kernel.InternalAbstractGraphDatabase.createPageCache(InternalAbstractGraphDatabase.java:704)
    at org.neo4j.kernel.InternalAbstractGraphDatabase.create(InternalAbstractGraphDatabase.java:473)
    at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:321)
    at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:59)
    at org.neo4j.graphdb.factory.GraphDatabaseFactory.newDatabase(GraphDatabaseFactory.java:108)
    at org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:95)
    at org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:176)
    at org.neo4j.graphdb.factory.GraphDatabaseFactory.newEmbeddedDatabase(GraphDatabaseFactory.java:67)
    at com.kchakrab.BaseGraph.CreateBaseGraphReducer.reduce(CreateBaseGraphReducer.java:29)
    at com.kchakrab.BaseGraph.CreateBaseGraphReducer.reduce(CreateBaseGraphReducer.java:21)
    at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176)
    at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:572)
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:414)
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:392)
java.lang.OutOfMemoryError:超出GC开销限制
位于org.neo4j.io.pagecache.impl.muninn.MuninnPageCache.(MuninnPageCache.java:230)
位于org.neo4j.kernel.impl.pagecache.ConfiguringPageCacheFactory.createPageCache(ConfiguringPageCacheFactory.java:63)
位于org.neo4j.kernel.impl.pagecache.ConfiguringPageCacheFactory.getOrCreatePageCache(ConfiguringPageCacheFactory.java:56)
位于org.neo4j.kernel.InternalAbstractGraphDatabase.createPageCache(InternalAbstractGraphDatabase.java:704)
位于org.neo4j.kernel.InternalAbstractGraphDatabase.create(InternalAbstractGraphDatabase.java:473)
位于org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:321)
位于org.neo4j.kernel.EmbeddedGraphDatabase。(EmbeddedGraphDatabase.java:59)
位于org.neo4j.graphdb.factory.GraphDatabaseFactory.newDatabase(GraphDatabaseFactory.java:108)
位于org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:95)
位于org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:176)
位于org.neo4j.graphdb.factory.GraphDatabaseFactory.newEmbeddedDatabase(GraphDatabaseFactory.java:67)
位于com.kchakrab.BaseGraph.CreateBaseGraphReducer.reduce(CreateBaseGraphReducer.java:29)
位于com.kchakrab.BaseGraph.CreateBaseGraphReducer.reduce(CreateBaseGraphReducer.java:21)
位于org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176)
位于org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:572)
位于org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:414)
位于org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:392)

那么,有人能告诉我我做错了什么吗?是否每次都将整个数据库加载到内存中,并且每个reduce方法的加载都会导致GC开销?

Neo4j 2.2默认情况下最多使用可用RAM减去堆大小的75%。这取决于您的设置,可能太多了

你应该调整到一个合理的值

示例:假设您有16 GB RAM。JVM的默认堆大小为25%(=4GB)。其余的(12GB)中,75%(=9GB)用于页面缓存,而3GB用于操作系统和其他应用程序。对于仅运行neo4j的服务器系统,默认值75%是一个合理的选择。如果机器也做其他事情(桌面、其他服务器进程),可能会将
dbms.pagecache.memory
设置为5 GB


JVM堆大小可以在
neo4j wrapper.conf
中配置,谢谢。我有8gb内存。因此,我通过命令行(Xmx参数)将JVM设置为2G,并将neo4j.properties中的pagecache.memory设置为2G。它现在正在运行。这需要一些时间。让我们看看结果如何。所以,我仍然有这个问题。我甚至尝试将pagecache.memory设置为1g。我仍然总是以“超出GC开销限制”而告终。还有什么建议吗?Stefan的回答很好——但具体地回答你的问题——没有,数据库没有加载到内存中。Stefan描述了如何使用内存以及如何调整内存,但当您在特定路径上创建嵌入式数据库时,您是在该路径上将数据库保存到磁盘,它只是一个充满文件的常规目录。很高兴知道这一点。但是,那为什么我有GC开销呢?是交易吗?一定有什么东西填满了我的记忆。感谢您的帮助。