在同一个VM中切换WAL使用情况?

时间:2015-10-29 13:22:11

标签: java orientdb

我是Hawk model indexing工具的开发人员之一。我们的工具将XMI模型索引到图形中以加速以后的查询,并且需要在“批量插入”和“事务更新”模式之间来回切换。我们第一次注意到目录中的新文件时使用“批量插入”,从那时起,我们使用“事务更新”模式使其图形保持同步。

我们最近添加的OrientDB 2.1.4 backend使用OrientGraphFactory中的getTx()/ getNoTx()方法来获取相应的OrientGraph / OrientGraphNoTx实例。但是,与Neo4j相比,我们没有获得非常好的吞吐量。将WAL放入带有OrientDB的Linux ramdisk中时,索引set0.xmi需要90秒,而在相同条件下(机器+操作系统+ JDK),我们的Neo4j后端需要22秒。我们正在使用这些额外设置来尝试减少时间:

  • 将WAL缓存大小增加到10000
  • 禁用页面刷新同步
  • 仅保存脏对象
  • 使用大量插入意图
  • 禁用事务日志
  • 禁用MVCC
  • 禁用验证
  • 尽可能使用轻量边缘

我们曾想过在进入“批量插入”模式时禁用WAL,但似乎没有一种简单的方法可以打开和关闭它。它似乎只能在程序启动时设置一次,就是这样。我们已经尝试显式关闭底层存储,以便在重新打开存储时再次读取USE_WAL标志,但这只会导致NullPointerExceptions和其他随机错误。

任何有关我们如何切换WAL或提高性能的指示都将非常感激。

更新:我们已经切换到使用原始文档API并自己标记脏节点/边缘,我们现在达到55秒,但WAL问题仍然存在。也试过2.2.0-beta,但实际上需要更长的时间。

1 个答案:

答案 0 :(得分:1)

我们自己解决了这个问题。离开这个以防万一它可以帮助某人:-)。在我们的后端进行了许多内部改进(仍然使用原始文档API)并切换到OrientDB 2.0.15之后,我们已经达到了30秒,我们找到了自己切换Write Ahead Log的方法。这适用于我们(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");
}

我很傻,以为我必须首先关闭数据库然后关闭存储空间,但事实证明并非如此:-)。有必要使用ODAGDocumentTx #close方法的两个arg版本,因为no-arg版本对通过plocal:// URL使用的OAbstractPaginatedStorage实现基本上没有任何作用。