Java OrientDB慢写

Java OrientDB慢写,java,orientdb,Java,Orientdb,OrientDB官方网站称: 在通用硬件上,每秒最多可存储150.000个文档,10 每天有数十亿份文件。大图以很少的速度加载 毫秒,而不执行代价高昂的联接,如关系 数据库管理系统 但是,执行以下代码表明插入150000个简单文档需要17000毫秒 import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx; import com.orientechnologies.orient.core.record.imp

OrientDB官方网站称:

在通用硬件上,每秒最多可存储150.000个文档,10 每天有数十亿份文件。大图以很少的速度加载 毫秒,而不执行代价高昂的联接,如关系 数据库管理系统

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

}
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
导入com.orientechnologies.orient.core.record.impl.ODocument;
公开期末课程定向试验{
公共静态void main(字符串[]args){
ODatabaseDocumentTx db=新的ODatabaseDocumentTx(“远程:本地主机/foo”);
试一试{
数据库开放(“管理员”、“管理员”);
长a=System.currentTimeMillis();
对于(int i=1;i<150000;++i){
最终气味文件foo=新气味文件(“foo”);
foo.字段(“代码”,i);
foo.save();
}
长b=系统.currentTimeMillis();
System.out.println(b-a+“ms”);
对于(ODocument文档:db.browseClass(“Foo”)){
doc.delete();
}
}最后{
db.close();
}
}
}
我的硬件:

  • 戴尔Optiplex 780
  • 英特尔(R)核心(TM)2双CPU E7500@2.93Ghz
  • 8GB内存
  • Windows 7 64位
我做错了什么


将存储拆分为10个并发线程以最大限度地减少Java的开销,使其运行时间约为13000毫秒。仍然比OrientDB首页所说的慢得多。

您可以通过使用“平面数据库”和OrientDB作为java中的嵌入式库来实现这一点 请参阅此处的更多说明

您使用的是服务器模式,它向orientdb服务器发送许多请求, 根据您的基准测试,每秒插入约10000次,这还不错, e、 g我认为10000个请求/秒对于任何Web服务器都是非常好的性能
(orientdb服务器实际上是一个Web服务器,您可以通过http查询它,但我认为java使用的是二进制模式)

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

几点提示:

->不要总是实例化OdoDocument:

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

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

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


正如Krisztian指出的,如果可能,请重用对象。

您是否能够获得最佳性能?我研究了这个问题,但我的性能甚至比你差。我决定使用H2而不是OrientDB。H2适合我的用例。使用System.currentTimeMillis作为秒表进行如此长时间运行的测试没有问题。当然,你可以在测量之前做一些热身(并使用纳米时间),但我不认为这会改变结果的大小。你甚至可以用手测量时间,它是有效的。