11

OrientDB官方网站说:

在普通硬件上,每秒最多可存储 150,000 个文档,每天可存储 100 亿个文档。大图在几毫秒内加载,无需执行昂贵的 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 双核 CPU E7500 @ 2.93Ghz
  • 8GB 内存
  • 视窗 7 64 位

我究竟做错了什么?

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

4

3 回答 3

4

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

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

于 2012-09-04T00:45:33.683 回答
3

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

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

于 2012-09-04T09:25:27.373 回答
3

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

几个小贴士:

->不要总是实例化 ODocument:

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

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

于 2012-09-04T08:05:06.603 回答