OrientDB 写入缓慢

11

OrientDB官网表示:

在普通硬件上,每秒可以存储高达150,000个文档,每天可达100亿个文档。大型图表可在几毫秒内加载,而无需执行像关系型DBMS那样昂贵的JOIN操作。

然而,执行以下代码显示,插入150000个简单文档需要约17000毫秒。

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.record.impl.ODocument;

public final class OrientDBTrial {

    public static void main(String[] args) {
        ODatabaseDocumentTx db = new ODatabaseDocumentTx("remote:localhost/foo");
        try {
            db.open("admin", "admin");

            long a = System.currentTimeMillis();
            for (int i = 1; i < 150000; ++i) {
                final ODocument foo = new ODocument("Foo");
                foo.field("code", i);
                foo.save();
            }
            long b = System.currentTimeMillis();
            System.out.println(b - a + "ms");

            for (ODocument doc : db.browseClass("Foo")) {
                doc.delete();
            }
        } finally {
            db.close();
        }
    }

}

我的硬件配置:

  • Dell Optiplex 780
  • Intel(R) Core(TM)2 Duo CPU E7500 @ 2.93Ghz
  • 8GB RAM
  • Windows 7 64位操作系统

我做错了什么?

将保存操作分割成10个并发线程以最小化Java开销,使其运行时间为大约13000毫秒。但仍比OrientDB首页所说的要慢得多。


你能获得最佳性能吗?我研究了这个问题,但我的表现甚至比你还差。 - Vladislav Koroteev
我决定使用H2而不是OrientDB。 H2更适合我的用例。 - Thiago Negri
3个回答

4
您可以通过在Java中使用“Flat Database”和OrientDB作为嵌入式库来实现。有关详细信息,请参见此处http://code.google.com/p/orient/wiki/JavaAPI
您所使用的是服务器模式,它会向OrientDB服务器发送许多请求。根据您的基准测试结果,您每秒获得了约10,000个插入操作,这是不错的表现。例如,我认为对于任何Web服务器来说,每秒处理10,000个请求都是非常好的表现(而OrientDB服务器实际上也是一个Web服务器,您可以通过HTTP查询它,但我认为Java使用的是二进制模式)。

3

首先请阅读文档以了解如何获得最佳性能!

以下是一些技巧:

-> 不要总是实例化ODocument:

  final ODocument doc;
  for (...) {
    doc.reset();
    doc.setClassName("Class");
    // Put data to fields
    doc.save();
  }

->不要依赖System.currentTimeMillis() - 使用perf4j或类似工具来测量时间,因为第一个方法测量全局系统时间,因此包括运行在您系统上的所有其他程序的执行时间!


这样长时间运行的测试使用System.currentTimeMillis作为秒表是没有问题的。当然,在测量之前可以进行一些预热(并使用nanoTime),但我认为这不会改变结果的数量级。你甚至可以手动测量时间,它也是有效的。 - eckes

3

来自OrientDB网站的数字是基于本地数据库(没有网络开销)进行基准测试的,因此如果您使用远程协议,则应预期会有一些延迟。

正如Krisztian所指出的那样,尽可能重复使用对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接