我有一个关于在 Neo4j Java API 中创建新的/修改现有的大数据库的问题。 以前,我尝试过使用简单的方法来修改数据库中每个节点的标签,这确实非常耗时。 我找到了一个解决方案,那就是“BatchInserter”。
config.put("neostore.nodestore.db.mapped_memory", "50000M");
db = BatchInserters.inserter("dblp.db", config);
BatchInserterIndexProvider indexProvider = new LuceneBatchInserterIndexProvider(db);
index = indexProvider.nodeIndex("dblpIndex", MapUtil.stringMap("type", "exact"));
index.setCacheCapacity(URI_PROPERTY, 500000001);
if ((totalEntity % 50000) == 0) {
System.out.println("entities: " + totalEntity);
index.flush();
}
通过这种方法创建/修改数据库非常快。然而,在此之后,当我想在 Java/Cypher API 中使用这个数据库时,需要花费很多时间才能启动。 我想应该和一些索引的东西有关吧!但我不知道如何解决它。您能指导我吗?
编辑以澄清
我不运行任何查询,并且在使用服务器或 Java API 启动时都需要时间。
我有另一个数据库,它在启动时速度非常快。我比较了他们的 message.log
较慢的一个瓶颈是:
2016-02-03 22:25:54.730+0000 INFO [o.n.k.i.DiagnosticsManager] --- INITIALIZED diagnostics END ---
2016-02-03 22:28:18.408+0000 INFO [o.n.k.KernelHealth] Kernel health set to OK
在这行 message.log 之后需要三分钟
但是,对于磁盘上具有相同容量的更快速度:
2016-02-03 22:30:28.254+0000 INFO [o.n.k.i.DiagnosticsManager] --- INITIALIZED diagnostics END ---
2016-02-03 22:30:43.380+0000 INFO [o.n.k.KernelHealth] Kernel health set to OK
只需几秒钟。
<小时/>我已经检查了插入代码。我在程序结束时使用了 db.shutdown(),我记得它是消耗更多时间/内存的部分。
最后一件事可能有用的是:对于更快的,我可以看到一些 lucene 节点索引初始化(例如 _0.fdt: 2015-12-23T12:52:33-0800 - 143.00 B, _1.fdx: 2015 -12-23T12:53:13-0800 - 3.81 MB) 在 message.log 中,但在较慢的 message.log 文件及其相应目录 (database.db/index/lucene/节点/)
最佳答案
怀疑:你没有打电话BatchInserter.shutdown()
?
显式关闭批插入器至关重要。如果没有,启动数据存储将导致启动时进行健全性检查(最好情况)或数据存储不可用(不是最好情况)。
关于java - 批量插入修改后启动 Neo4j 服务器变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35168570/