在同一个 VM 中切换 WAL 使用?
Toggling WAL usage within same VM?
我是 Hawk model indexing 工具的开发者之一。我们的工具将 XMI 模型索引到图表中以加快以后的查询速度,它需要在 "batch insert" 和 "transactional update" 模式之间来回切换。 "batch insert" 在我们第一次注意到目录中的新文件时使用,从那时起我们使用 "transactional update" 模式来保持其图形同步。
我们最近添加的 OrientDB 2.1.4 backend 使用 OrientGraphFactory 中的 getTx()/getNoTx() 方法来获取适当的 OrientGraph/OrientGraphNoTx 实例。然而,与 Neo4j 相比,我们并没有获得很好的吞吐量。使用 OrientDB 将 WAL 放入 Linux ramdisk 时,索引 set0.xmi 需要 90 秒,而在相同条件下使用我们的 Neo4j 后端需要 22 秒(机器 + OS + JDK) .我们正在使用这些附加设置来尝试减少时间:
- 将 WAL 缓存大小增加到 10000
- 页面刷新时禁用同步
- 只保存脏对象
- 使用大量插入意图
- 禁用事务日志
- 禁用 MVCC
- 禁用验证
- 尽可能使用轻量级边
我们考虑过在进入 "batch insert" 模式时禁用 WAL,但似乎没有一种简单的方法来打开和关闭它。看来它只能在程序启动时设置一次,仅此而已。我们已尝试显式关闭底层存储,以便在重新打开存储时再次读取 USE_WAL 标志,但这只会导致 NullPointerExceptions 和其他随机错误。
任何关于我们如何切换 WAL 或提高性能的指示都将不胜感激。
更新:我们已经切换到使用原始文档 API 并自己标记为脏 nodes/edges,我们现在达到了 55 秒,但 WAL 问题仍然存在。也试过2.2.0-beta,但实际耗时更长
我们自己解决了这个问题。留下这个以防它可能对某人有帮助:-)。在我们的后端进行了许多内部改进(仍然使用原始文档 API)并切换到 OrientDB 2.0.15 后,我们已经达到了 30 秒,我们找到了自己切换预写日志的方法。这对我们有用(db 是我们的 ODatabaseDocumentTx 实例):
private void reopenWithWALSetTo(final boolean useWAL) {
db.getStorage().close(true, false);
db.close();
OGlobalConfiguration.USE_WAL.setValue(useWAL);
db = new ODatabaseDocumentTx(dbURL);
db.open("admin", "admin");
}
我当时很傻,以为我必须先关闭数据库,然后再关闭存储,但事实证明并非如此:-)。有必要使用 ODatabaseDocumentTx#close 方法的双参数版本,因为无参数版本基本上对通过 plocal:// URL 使用的 OAbstractPaginatedStorage 实现没有任何作用。
我是 Hawk model indexing 工具的开发者之一。我们的工具将 XMI 模型索引到图表中以加快以后的查询速度,它需要在 "batch insert" 和 "transactional update" 模式之间来回切换。 "batch insert" 在我们第一次注意到目录中的新文件时使用,从那时起我们使用 "transactional update" 模式来保持其图形同步。
我们最近添加的 OrientDB 2.1.4 backend 使用 OrientGraphFactory 中的 getTx()/getNoTx() 方法来获取适当的 OrientGraph/OrientGraphNoTx 实例。然而,与 Neo4j 相比,我们并没有获得很好的吞吐量。使用 OrientDB 将 WAL 放入 Linux ramdisk 时,索引 set0.xmi 需要 90 秒,而在相同条件下使用我们的 Neo4j 后端需要 22 秒(机器 + OS + JDK) .我们正在使用这些附加设置来尝试减少时间:
- 将 WAL 缓存大小增加到 10000
- 页面刷新时禁用同步
- 只保存脏对象
- 使用大量插入意图
- 禁用事务日志
- 禁用 MVCC
- 禁用验证
- 尽可能使用轻量级边
我们考虑过在进入 "batch insert" 模式时禁用 WAL,但似乎没有一种简单的方法来打开和关闭它。看来它只能在程序启动时设置一次,仅此而已。我们已尝试显式关闭底层存储,以便在重新打开存储时再次读取 USE_WAL 标志,但这只会导致 NullPointerExceptions 和其他随机错误。
任何关于我们如何切换 WAL 或提高性能的指示都将不胜感激。
更新:我们已经切换到使用原始文档 API 并自己标记为脏 nodes/edges,我们现在达到了 55 秒,但 WAL 问题仍然存在。也试过2.2.0-beta,但实际耗时更长
我们自己解决了这个问题。留下这个以防它可能对某人有帮助:-)。在我们的后端进行了许多内部改进(仍然使用原始文档 API)并切换到 OrientDB 2.0.15 后,我们已经达到了 30 秒,我们找到了自己切换预写日志的方法。这对我们有用(db 是我们的 ODatabaseDocumentTx 实例):
private void reopenWithWALSetTo(final boolean useWAL) {
db.getStorage().close(true, false);
db.close();
OGlobalConfiguration.USE_WAL.setValue(useWAL);
db = new ODatabaseDocumentTx(dbURL);
db.open("admin", "admin");
}
我当时很傻,以为我必须先关闭数据库,然后再关闭存储,但事实证明并非如此:-)。有必要使用 ODatabaseDocumentTx#close 方法的双参数版本,因为无参数版本基本上对通过 plocal:// URL 使用的 OAbstractPaginatedStorage 实现没有任何作用。