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

标签 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(字符串)、国家/地区代码(字符串)和 type(字符串)。
  • 14'724'489 个加权链接。

这会产生 11 GB 的 graph.db 目录。目录 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,其中 graph.db/index/目录大小为 243 GB(由于 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)
  • jar 文件是从 Eclipse 导出的。
  • 从 11 GB 数据库转到 249 GB 版本时,日志没有提供任何线索。

最佳答案

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

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

关于java - 将属性添加到节点时,Neo4j 数据库会因 Lucene 日志而爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29656457/

相关文章:

MySQL 查询 - 为什么在这种情况下不使用索引?

mysql - MySQL中多列索引的效率

Lucene 索引

lucene - Solr支持自定义FunctionQuery吗?

java - Lucene:Lucene如何存储同名字段

java - 使用字符串使用最大内存

java - 加号在字符串中的作用是什么?

java - 在 BottomNavigationView 中开始 fragment

java - 有没有办法通过java来控制鼠标?

xcode - 如何在 Xcode 4 中禁用索引?