2010-07-07 10 views
9

Od jakiegoś czasu szukałem dobrej bazy danych NoSQL dla niektórych naszych projektów i niedawno odkryłem RavenDB, który wygląda całkiem nieźle z perspektywy wsparcia .NET, więc postanowiłem wypróbować i napisać mały test porównawczy. Pierwszy porządek obrad został testowania szybkości insert, stosując następujący kod:Jakiego poziomu wydajności powinienem oczekiwać od RavenDB?

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

Wyjście jest następująca:

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

Jest on stosunkowo szybkim maszyny (3 GHz, 2 GB RAM z systemem Windows 7)

Zadzwoń do mnie szalona, ​​ale 1000 wstawek/s jest strasznie powolna, szczególnie w przypadku dokumentów, które zawierają tylko dwa pola. Czy można się tego spodziewać? Wiem, że RavenDB jest zoptymalizowany do czytania, a nie do pisania, ale jest to bardzo złe.

+0

Czy pozwoliłeś na rozgrzewkę, że JIT i inne czynności związane z uruchomieniem zostały wyliczone? –

Odpowiedz

9

Nie wiem, czy uda Ci się osiągnąć znacznie szybciej, ze względu na całą "zoptymalizowaną dla czytania, nie pisz".

Ale jeśli czytasz poprzez this thread istnieją pewne sugestie: pisze

  • Batch up (które robią). Nie jestem pewien, trzeba zamknąć i ponownie otworzyć sesję choć, trzeba po prostu być w stanie wywołać SaveChanges()
  • Ustaw tryb transakcji na leniwe (Raven/TransactionMode)
  • Czy importu asynchronicznie, czyli od kilku wątków

Jedną rzeczą można spróbować to embedded mode, czyli zmienić sesję

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

ten omija ruchu HTTP i wstawia dokumentów bezpośrednio patrz the docs dla więcej informacji.

+0

Próbowałem wszystkich tych rzeczy, a wzrost wydajności nie był zauważalny. Domyślam się, że RavenDB jest zbyt wolny dla moich scenariuszy użycia (napisz ciężki). Dam ci odpowiedź, ale kwestia ta jest w tej chwili nierozwiązywalna. – Chris

+0

Możesz opublikować tę wiadomość na liście dyskusyjnej RavenDB http://groups.google.com/group/ravendb/. Jestem daleko od eksperta RavenDB, więc możesz uzyskać lepszą odpowiedź. –

+6

Nastąpiło pewne dostrojenie wydajności w przypadku pisania ciężkich scenariuszy wcześniej w 2011 roku. Prawdopodobnie teraz uzyskasz lepsze wyniki. –

Powiązane problemy