【问题标题】:OrientDB slow writeOrientDB 慢写
【发布时间】:2012-08-30 21:02:49
【问题描述】:

OrientDB 官网说:

在普通硬件存储中,每秒最多 150.000 个文档,10 每天数十亿份文件。大图加载在几个 毫秒而不执行昂贵的 JOIN,例如关系 DBMS。

但是,执行以下代码表明插入 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();
        }
    }

}

我的硬件:

  • 戴尔 Optiplex 780
  • Intel(R) Core(TM)2 Duo CPU E7500 @ 2.93Ghz
  • 8GB 内存
  • Windows 7 64 位

我做错了什么?

将保存拆分为 10 个并发线程以最小化 Java 的开销,使其运行时间约为 13000 毫秒。仍然比 OrientDB 头版说的慢得多。

【问题讨论】:

  • 你能获得最大的性能吗?我研究这个问题,但是我的表现比你还差
  • 我决定使用 H2 而不是 OrientDB。 H2 适合我的用例。

标签: java orientdb


【解决方案1】:

您可以通过使用“平面数据库”和 orientdb 作为 java 中的嵌入式库来实现这一点 在这里查看更多解释 http://code.google.com/p/orient/wiki/JavaAPI

您使用的是服务器模式,它向 orientdb 服务器发送许多请求, 从您的基准测试来看,您每秒插入约 10 000 次,这还不错, 例如,我认为 10 000 个请求/秒对于任何网络服务器来说都是非常好的性能 (而orientdb server其实是一个webserver,可以通过http查询,不过我觉得java是用二进制模式的)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      首先阅读有关如何获得最佳性能的文档!

      小贴士:

      -> 不要总是实例化 ODocument:

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

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

      【讨论】:

      • 这么长时间运行的测试使用 System.currentTimeMillis 作为秒表是没有问题的。当然,您可以在测量之前进行一些预热(并使用 nanoTime),但我认为这不会改变结果的数量级。您甚至可以手动测量时间,它是有效的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多