我是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,但似乎没有一种简单的方法可以打开和关闭它。它似乎只能在程序启动时设置一次,就是这样。我们已经尝试显式关闭底层存储,以便在重新打开存储时再次读取USE_WAL标志,但这只会导致NullPointerExceptions和其他随机错误。
任何有关我们如何切换WAL或提高性能的指示都将非常感激。
更新:我们已经切换到使用原始文档API并自己标记脏节点/边缘,我们现在达到55秒,但WAL问题仍然存在。也试过2.2.0-beta,但实际上需要更长的时间。
答案 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实现基本上没有任何作用。