当属性添加到节点时,由于 Lucene 日志,Neo4j 数据库爆炸
Neo4j database exploding due to Lucene logs when properties are added to nodes
我在使用 Neo4j 时遇到问题,目录 graph.db/index/ 由于生成了许多大 lucene.log.vXXX 文件而急剧增加。这种情况发生在根本不使用索引的计算中,而只是将数字属性添加到网络中的某些节点。
在两台不同的 64 位计算机上,版本 2.1.3、2.1.7 和 2.2.0 可重现此问题 运行 Ubuntu Linux(14.04.1 和14.04.2).
我的数据库:
- 16'636'351 个节点,具有 4 个属性:id(字符串)、名称(字符串)、国家代码(字符串)和类型(字符串)。
- 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 的图表。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 运行时环境(build 1.7.0_76-b13)和 OpenJDK 运行时环境(IcedTea 2.5.4)(7u75-2.5.4- 1~信任1)
- jar 文件是从 Eclipse 导出的。
- 从 11 GB 数据库到 249 GB 版本时,日志没有提供任何线索。
默认情况下,Neo4j 将逻辑日志保留 7 天(旧版本有不同的值)。由于您启用了自动索引,因此对节点的任何更新都可能导致索引更新 - 如果您仅更改非索引属性,则索引可能为空。
为防止关闭数据库,制作备份副本并删除 lucene.log.vXXX
文件。在您的启动代码中将 keep_logical_logs=false
修改为配置选项。
我在使用 Neo4j 时遇到问题,目录 graph.db/index/ 由于生成了许多大 lucene.log.vXXX 文件而急剧增加。这种情况发生在根本不使用索引的计算中,而只是将数字属性添加到网络中的某些节点。
在两台不同的 64 位计算机上,版本 2.1.3、2.1.7 和 2.2.0 可重现此问题 运行 Ubuntu Linux(14.04.1 和14.04.2).
我的数据库:
- 16'636'351 个节点,具有 4 个属性:id(字符串)、名称(字符串)、国家代码(字符串)和类型(字符串)。
- 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 的图表。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 运行时环境(build 1.7.0_76-b13)和 OpenJDK 运行时环境(IcedTea 2.5.4)(7u75-2.5.4- 1~信任1)
- jar 文件是从 Eclipse 导出的。
- 从 11 GB 数据库到 249 GB 版本时,日志没有提供任何线索。
默认情况下,Neo4j 将逻辑日志保留 7 天(旧版本有不同的值)。由于您启用了自动索引,因此对节点的任何更新都可能导致索引更新 - 如果您仅更改非索引属性,则索引可能为空。
为防止关闭数据库,制作备份副本并删除 lucene.log.vXXX
文件。在您的启动代码中将 keep_logical_logs=false
修改为配置选项。