2010-07-07 17 views
9

Ich habe seit einiger Zeit nach einer guten NoSQL-Datenbank für einige unserer Projekte gesucht und kürzlich habe ich RavenDB entdeckt, was ziemlich toll aus der Sicht von .NET-Support aussieht. Also entschied ich mich, es auszuprobieren und einen kleinen Benchmark zu schreiben. Erster Auftrag von Unternehmen testete Einfügegeschwindigkeit, mit dem folgenden Code:Welches Leistungsniveau sollte ich von RavenDB erwarten?

class Program 
{ 
    private const int TEST_COUNT = 10000; 
    static void Main(string[] args) 
    { 

     var store = new DocumentStore(); 
     store.Url = "http://localhost:8117"; 
     store.Initialize(); 

     var timer = Stopwatch.StartNew(); 
     var session = store.OpenSession(); 
     for (var i = 0; i < TEST_COUNT; i++) 
     { 
      session.Store(new TestEntity() 
      { 
       Name = "Test Entity" 
      }); 

      if (i % 127 == 0) 
      { 
       session.SaveChanges(); 
       session.Dispose(); 
       session = store.OpenSession(); 
      } 
     } 

     session.SaveChanges(); 
     session.Dispose(); 
     timer.Stop(); 

     Console.WriteLine("Processed {0:n0} records", TEST_COUNT); 
     Console.WriteLine("Time elapsed: {0:n0} ms", timer.ElapsedMilliseconds); 
     Console.WriteLine("Records/sec: {0:n0}", TEST_COUNT/(timer.ElapsedMilliseconds/1000d)); 
    } 
} 

class TestEntity 
{ 
    public string Name { get; set; } 
    public DateTime Created { get; set; } 

    public TestEntity() 
    { 
     Created = DateTime.UtcNow; 
    } 
} 

Der Ausgang ist wie folgt:

Processed 10,000 records 
Time elapsed: 9,531 ms 
Records/sec: 1,049 
Press any key to continue . . . 

Dies ist auf eine relativ schnelle Maschine (3 GHz, 2 GB RAM unter Windows 7)

Rufen Sie mich verrückt, aber 1000 Einfügungen/Sekunde ist schrecklich langsam, besonders für Dokumente, die nur zwei Felder enthalten. Ist das zu erwarten? Ich weiß, RavenDB ist für Lesevorgänge optimiert, nicht für Schreibvorgänge, aber das ist ziemlich schlecht.

+0

Haben Sie eine Aufwärmphase zugelassen, sodass JIT und andere Startaktivitäten ausgeklammert wurden? –

Antwort

9

Ich weiß nicht, ob Sie viel schneller als das wegen der ganzen "für das Lesen optimiert, nicht schreiben" Sache bekommen.

Aber wenn man durch this thread dort zu lesen sind einige Vorschläge:

  • Batch up schreibt (was Sie tun). Ich bin nicht sicher, was Sie brauchen, um zu schließen und dann wenn die Sitzung wieder öffnen, sollten Sie nur in der Lage sein, den Transaktionsmodus aufzurufen SaveChanges()
  • Set zu faul (Raven/TransactionMode)
  • asynchron die Einfuhren tun, dh von mehreren Threads

Eine andere Sache, die Sie versuchen könnte, ist die embedded mode, dh Ihre Sitzung

ändern
var documentStore = new DocumentStore { DataDirectory = "path/to/database/directory" }; 
documentStore.Initialize(); 

Dies umgeht den HTTP-Datenverkehr und fügt Dokumente direkt finden the docs für Mehr Info.

+0

Ich habe alles versucht und der Leistungsgewinn war nicht bemerkbar. Ich denke, RavenDB ist einfach zu langsam für meine Nutzungsszenarien (schwer schreiben). Ich gebe dir trotzdem die Antwort, aber das Problem ist zu diesem Zeitpunkt irgendwie unlösbar. – Chris

+0

Sie könnten dies in der RavenDB-Mailingliste http://groups.google.com/group/ravendb/ veröffentlichen. Ich bin weit entfernt von einem RavenDB-Experten, damit du eine bessere Antwort bekommst. –

+6

Es gab einige Performance-Tuning für schwere Szenarien Anfang 2011 getan. Sie würden jetzt wahrscheinlich bessere Ergebnisse erzielen. –

Verwandte Themen