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



我遇到了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(字符串),country code(字符串)和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();

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

到目前为止还不错。

现在我对数据库进行计算。忽略这些细节,算法为网络中最大连接组件中的所有节点(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用于图形.db/index/!!!

这里发生了什么?


PS
其他信息:

  • Java版本:Java(TM)SE Runtime Environment(build 1.7.0_76-b13)和OpenJDK Runtime Environment(IcedTea 2.5.4)(7u75-2.5.4-1~trust1)
  • jar文件是从Eclipse导出的
  • 从11 GB数据库到249 GB版本时,日志没有提供任何线索

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

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

最新更新