当属性添加到节点时,Neo4j数据库因Lucene日志而爆炸

时间:2015-04-15 17:06:03

标签: java indexing lucene neo4j embedded-resource

我遇到了Neo4j的问题,由于生成了许多大的lucene.log.vXXX文件,目录graph.db / index /的大小急剧增加。对于根本不使用索引的计算会发生这种情况,但只是将数字属性添加到网络中的某些节点。

在运行Ubuntu Linux(14.04.1和14.04.2)的两台不同的64位计算机上,版本2.1.3,2.1.7和2.2.0的问题是可重现的。

我的数据库:

  • 16'636'351个节点,共有4个属性:id(字符串),name(字符串),国家代码(string)和type(字符串)。
  • 14'724'489加权链接。

这导致graph.db目录为11 GB。目录graph.db / index /是2.4 GB大。

我使用嵌入Java的Neo4j并始终实例化如下:

        String i1 = "id";
        String i2 = "name";
        String i3 = "country";
        String i4 = "type";
        String myIndeables = i1 + "," + i2 + "," + i3 + "," + i4;
        GraphDatabaseService gdbs = new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(cfg.dbPath).
                setConfig(GraphDatabaseSettings.node_keys_indexable, myIndeables).
                setConfig(GraphDatabaseSettings.node_auto_indexing, "true").
                setConfig(GraphDatabaseSettings.relationshipstore_mapped_memory_size, "12G").
                ...
                newGraphDatabase();

这种方式也用于创建(即导入)原始的11 GB数据库。

到目前为止一切顺利。

现在我对数据库进行计算。忽略细节,算法为网络中最大连通分量(6'118'740个节点)中的所有节点计算一种中心度量。

问题:
只需将这些新计算的数字作为属性添加到6'118'740节点(总共16'636'351),导致数据库爆炸到249 GB,带有243 GB graph.db / index /目录(到期)到lucene.log.vXXX文件)!!!

但是,如果我在没有索引的情况下实例化如下...

        gdbs = new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(cfg.dbPath).
                setConfig(GraphDatabaseSettings.relationshipstore_mapped_memory_size, "12G").
                ...
                newGraphDatabase();

...结果是6.9 GB的数据库大小(回想起原来是11 GB!),其中现在只有2.2 GB用于graph.db / index / !!!

这里发生了什么?


PS
其他信息:

  • Java版本:Java(TM)SE运行时环境(版本1.7.0_76-b13)和OpenJDK运行时环境(IcedTea 2.5.4)(7u75-2.5.4-1~trusty1)
  • 从Eclipse导出jar文件。
  • 从11 GB数据库转到249 GB版本时,日志不会提供任何线索。

1 个答案:

答案 0 :(得分:0)

默认情况下,Neo4j将逻辑日志保留7天(旧版本具有不同的值)。由于启用了自动索引,因此对节点的任何更新都可能导致索引更新 - 如果仅更改非索引属性,则可能为空。

要防止此操作关闭数据库,请制作备份副本并删除lucene.log.vXXX个文件。在您的启动代码中,修改keep_logical_logs=false作为配置选项。