当前位置: 首页 > 面试题库 >

Neo4j OutOfMemory问题

姚实
2023-03-14
问题内容

这是我的Main.java源代码。它是从neo4j-apoc-1.0示例中获取的。修改的目的是存储2个节点和1个关系的1M记录:

package javaapplication2;

import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.graphdb.Transaction;
import org.neo4j.kernel.EmbeddedGraphDatabase;


public class Main
{
    private static final String DB_PATH = "neo4j-store-1M";
    private static final String NAME_KEY = "name";

    private static enum ExampleRelationshipTypes implements RelationshipType
    {
        EXAMPLE
    }

    public static void main(String[] args)
    {
        GraphDatabaseService graphDb = null;

        try
        {
            System.out.println( "Init database..." );


            graphDb = new EmbeddedGraphDatabase( DB_PATH );

            registerShutdownHook( graphDb );


            System.out.println( "Start of creating database..." );


            int valIndex = 0;

            for(int i=0; i<1000; ++i)
            {
                for(int j=0; j<1000; ++j)
                {
                    Transaction tx = graphDb.beginTx();

                    try
                    {
                        Node firstNode = graphDb.createNode();
            firstNode.setProperty( NAME_KEY, "Hello" + valIndex );

                        Node secondNode = graphDb.createNode();
            secondNode.setProperty( NAME_KEY, "World" + valIndex );

                        firstNode.createRelationshipTo(
                           secondNode, ExampleRelationshipTypes.EXAMPLE );

                        tx.success();

                        ++valIndex;
                    }
                    finally
                    {
                        tx.finish();
                    }
                }
            }

            System.out.println("Ok, client processing finished!");
        }
        finally
        {
            System.out.println( "Shutting down database ..." );

            graphDb.shutdown();
        }
    }

    private static void registerShutdownHook( final GraphDatabaseService graphDb )
    {
        // Registers a shutdown hook for the Neo4j instance so that it
        // shuts down nicely when the VM exits (even if you "Ctrl-C" the
        // running example before it's completed)
        Runtime.getRuntime().addShutdownHook( new Thread()
        {
            @Override
            public void run()
            {
                graphDb.shutdown();
            }
        } );
    }
}

经过几次迭代(大约150K),我得到了错误消息:


java.lang.OutOfMemoryError:位于org.neo4j.kernel.impl.nioneo的java.nio.ByteBuffer.allocate(ByteBuffer.java:312)处的java.nio.HeapByteBuffer。(HeapByteBuffer.java:39)处的Java堆空间。
org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.allocateNewWindow(PersistenceWindowPool.java:534)上的store.PlainPersistenceWindow。(PlainPersistenceWindow.java:30)在org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.refreshBricks
(PersistenceWindowPool.java:430)在org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.acquire(PersistenceWindowPool.java:122)在org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.acquireWindow(CommonAbstractStore.java
:459),位于org.neo4j的org.neo4j.kernel.impl.nioneo.store.AbstractDynamicStore.updateRecord(AbstractDynamicStore.java:240)。位于org.neo4j.kernel.impl.nioneo.xa.Command
$
PropertyCommand.execute(Command.java:513)处的kernel.impl.nioneo.store.PropertyStore.updateRecord(PropertyStore.java:209)。
org.neo4j.kernel.impl.transaction.xaframework.XaTransaction.commit(XaTransaction.java:316)处的impl.nioneo.xa.NeoTransaction.doCommit(NeoTransaction.java:443)在org.neo4j.kernel.impl.transaction处。
org.neo4j.kernel.impl.transaction.xaframework.XaResourceHelpImpl.commit(XaResourceHelpImpl.java:64)的xaframework.XaResourceManager.javamit(XaResourceManager.java:399)org.neo4j.kernel.impl.transaction.TransactionImpl.doCommit(xaframework.XaResourceManager.java:399)
org.org.neo4j.kernel.impl.transaction.TxManager.commit(TxManager.java:571)上的TransactionImpl.java:514)org.org上的org.neo4j.kernel.impl.transaction.TxManager.commit(TxManager.java:543)上的TransactionImpl.java:514)
。org.neo4j.kernel.EmbeddedGraphDbImpl $
TransactionImpl.finish(EmbeddedGraphDbImpl.java:329)的neo4j.kernel.impl.transaction.TransactionImpl.commit(TransactionImpl.java:102)在javaApplication2.Main.main(Main.java:62)
28.05.2010 9:52:14 org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool
logWarn警告:[neo4j-store-1M \ neostore.propertystore.db.strings]无法分配直接缓冲区”

伙计们!帮帮我,我做错了什么,我该如何修理?在Windows XP 32位SP3平台上进行了测试。也许在创建自定义配置中提供解决方案?

thnx 4每个建议!


问题答案:

这是Windows上的一个配置问题,其中Neo4j无法使用内存映射的缓冲区。而是在堆上创建一个Java缓冲区。在1.0中,此缓冲区的默认大小为470MB,这比Windows
JVM的默认堆大。您有两种选择:

  1. 切换到具有自动配置功能的pom.xml中的APOC 1.1-SNAPSHOT(而不是1.0),它将自动JVM的最大50%分配给Neo4j

  2. 通过使用以下命令运行Java,将JVM堆调整为更多(例如512Mb):

java -Xmx512m ....

您甚至可以将其插入Eclipse中的“运行配置”中的JVM参数下。

让我们知道是否有帮助!

另外,对每个节点对执行完整的事务将花费很长时间。尝试在第一个循环中打开一个事务,是否每1​​000个节点对仅提交一次事务?

/彼得



 类似资料:
  • 问题内容: 包括: all Spring libs, Apache Tomcat 7.0 library 在构建路径中 但它仍然给出错误: 在“ org.sprintframework.web-3.1.0.M1.jar”中,我可以看到“ org.springframework.web.context.ContextLoaderListener”。 Google上的某个人说应该包含spring.ja

  • 问题内容: 我使用非常简单的代码返回XML 但是,出现以下错误 请帮忙。谢谢 问题答案: 运行时出现NoSuchMethodError表示你使用的库版本与生成代码所针对的版本不同。 在你的情况下,Spring是元凶。在运行时检查类路径上的内容,并确保以下各项: 版本与编译时间罐相同 如果存在多个版本,请删除不需要的版本

  • 问题内容: 我不明白注释和之间的实际区别是什么? 扩展名还是它们具有完全不同的含义?什么时候应该使用它们?在服务层中使用Spring ,在DAO 中使用javax? 谢谢回答。 问题答案: 几年前,Spring定义了自己的Transactional注释以使Spring bean方法具有事务性。 Java EE 7终于做了同样的事情,现在除了EJB方法外,还允许CDI bean方法是事务性的。因此,

  • 我在CentOS虚拟机中安装了RabbitMQ,该虚拟机的网络适配器被定义为Bridge。我正在尝试配置RabbitMQ管理,以便通过机器的IP地址访问WebApp。配置如下:

  • 这个FAQ的最新版本总是可以从Apache主站点得到,位于<http://httpd.apache.org/docs/2.2/faq/> 如果你的问题在这里没有找到答案,你也可以看看Apache 1.3 FAQ ,看你的问题是否在那里有了答案。 主题 背景 关于 Apache HTTP Server 的背景知识。 支持 我遇到问题该怎么办? 错误信息 这些错误信息是什么意思? 背景 什么是Apac

  • 发布问题 更新问题 设置问题悬赏 获取问题列表 获取一个问题详情 删除一个问题 获取用户发布的问题列表 发布问题 POST /questions 输入 字段 类型 描述 subject 字符串 必须,问题主题或者说标题,不能超过 255 字节 ,必须以 ? 结尾。(不区分全角或者半角) topics 数组 必须,绑定的话题,数组子节点必须符合 { "id": 1 } 的格式。 body 字符串

  • 问题内容: 我简直不敢相信我网站上正在发生的事情。当我添加此行时: 一切正常。如果我不这样做,CSS就会“混乱”,一切都会变得不同,布局也会变得“丑陋”。 这条线如何解决所有问题? 问题答案: 您正在将HTML与XHTML混合使用。 通常,声明用于区分HTMLish语言的版本(在这种情况下为HTML或XHTML)。 不同的标记语言将表现不同。我最喜欢的例子是。在浏览器中查看以下内容: XHTML

  • 我试图在fabric rocket chat上联系,但没有得到太多帮助,因此在SO上发布了它。我有以下疑问: 我们是否可以在链码内访问块高度(我知道这在客户端是可行的,但在链码内是否可能) 可以从链码中的正在进行的事务调用新事务吗? 想知道hyperledger Fabric中存储的数据的历史记录在哪里 我们可以根据链码中的transactionid进行查询吗? 在fabric链码中编写调度程序是