问题 OrientDB慢写


OrientDB官方网站说:

在通用硬件存储上,每秒最多150,000个文档,10   每天数十亿份文件。大图加载很少   没有执行昂贵的JOIN(例如Relational)的毫秒数   数据库管理系统。

但是,执行以下代码表明,插入150000个简单文档需要大约17000ms。

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();
        }
    }

}

我的硬件:

  • 戴尔Optiplex 780
  • 英特尔(R)酷睿(TM)2 Duo CPU E7500 @ 2.93Ghz
  • 8GB RAM
  • Windows 7 64位

我究竟做错了什么?

将保存拆分为10个并发线程以最大限度地减少Java的开销,使其在~13000ms内运行。比OrientDB首页所说的要慢得多。


9401
2017-08-30 21:02


起源

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


答案:


你可以通过使用'Flat Database'和orientdb作为java中的嵌入式库来实现这一点 在这里看到更多解释 http://code.google.com/p/orient/wiki/JavaAPI

您使用的是服务器模式,它向orientdb服务器发送许多请求, 根据你的基准测试,你每秒可以获得~10 000次插入,这也不错, 例如,我认为10 000个请求/秒对于任何网络服务器都是非常好的性能 (而orientdb服务器实际上是一个web服务器,您可以通过http查询它,但我认为java正在使用二进制模式)


4
2017-09-04 00:45





来自OrientDB站点的数字是针对本地数据库的基准测试(没有网络开销),因此如果您使用远程协议,则需要一些延迟。

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


3
2017-09-04 09:25





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

几点提示:

- > 不要始终实例化ODocument:

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

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


3
2017-09-04 08:05



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