2012-08-30 11 views
10

offizielle Seite Orientdb sagt:Orientdb langsamer Schreib

auf gemeinsame Hardware speichert bis zu 150.000 Dokumente pro Sekunde, 10 Milliarden von Dokumenten pro Tag. Große Graphen werden in wenigen Millisekunden geladen, ohne kostspielige JOIN wie die relationalen DBMS auszuführen.

Aber die Ausführung des folgenden Codes zeigt, dass es ~ 17000ms dauert, 150000 einfache Dokumente einzufügen.

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

} 

Meine Hardware:

  • Dell Optiplex 780
  • Intel (R) Core (TM) 2 Duo CPU E7500 @ 2.93GHz
  • 8GB RAM
  • Windows 7 64bit

Was mache ich falsch?

Das Teilen der Saves in 10 gleichzeitige Threads, um den Overhead von Java zu minimieren, ließ es in ~ 13000ms laufen. Immer noch viel langsamer als die OrientDB-Startseite sagt.

+0

Konnten Sie die meiste Leistung erzielen? Ich studiere dieses Problem, aber meine Leistung ist noch schlechter als du. –

+0

Ich habe mich entschieden, H2 anstelle von OrientDB zu verwenden. H2 passt zu meinem Anwendungsfall. –

Antwort

3

Sie können das erreichen, indem er ‚Flat Datenbank‘ und Orientdb als eingebettete Bibliothek in Java unter Verwendung mehr sehen http://code.google.com/p/orient/wiki/JavaAPI

hier erklärt, was Sie verwenden, ist Server-Modus und sendet viele Anfragen Server Orientdb, Beurteilung bei deinem Benchmark hast du ~ 10 000 Einfügungen pro Sekunde bekommen, was nicht schlecht ist, zB ich denke 10 000 Anfragen/s ist sehr gute Leistung für jeden Webserver (und orientdb Server ist eigentlich ein Webserver und man kann ihn über http abfragen, aber Ich denke, dass Java binären Modus verwendet)

3

Lesen Sie zuerst die Dokumentation, um die beste Leistung zu erzielen!

Ein paar Tipps:

-> Sie instanziiert NICHT oDocument immer:

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

-> Verlassen Sie sich nicht auf System.currentTimeMillis() - verwenden perf4j oder ein ähnliches Werkzeug Zeiten zu messen, da die erste Man misst globale Systemzeiten und schließt damit die Ausführungszeit aller anderen auf Ihrem System laufenden Programme ein!

+0

Es gibt kein Problem für einen so langen Test, System.currentTimeMillis als Stoppuhr zu verwenden.Natürlich könntest du vor dem Messen etwas Aufwärmen machen (und NanoTime verwenden), aber ich denke nicht, dass sich das Ergebnis um eine Größenordnung von Magnitut ändert. Sie können sogar die Zeit manuell messen und es wäre gültig. – eckes

3

Die Zahlen von der OrientDB-Site sind Benchmarks für eine lokale Datenbank (ohne Netzwerk-Overhead). Wenn Sie also ein Remote-Protokoll verwenden, erwarten Sie einige Verzögerungen.

Wie Krisztian darauf hingewiesen, Objekte möglichst wiederverwenden.