2010-07-07 15 views
9

He estado buscando una buena base de datos NoSQL para algunos de nuestros proyectos desde hace bastante tiempo y recientemente descubrí RavenDB que se ve bastante impresionante desde una perspectiva de soporte .NET, así que decidí probarlo y escribir un pequeño punto de referencia. En primer orden de los trabajos de prueba de velocidad de inserción, mediante el siguiente código:¿Qué nivel de rendimiento debo esperar de 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; 
    } 
} 

La salida es la siguiente:

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

Esto es en una máquina relativamente rápido (3 GHz, 2 GB de RAM que ejecuta Windows 7)

Llámame loco, pero 1000 inserts/sec es terriblemente lento, especialmente para documentos que contienen solo dos campos. ¿Es esto esperado? Sé que RavenDB está optimizado para lecturas, no para escrituras, pero esto es bastante malo.

+0

¿Permitió un período de calentamiento, por ejemplo, que JIT y otras actividades de inicio se excluyeron? –

Respuesta

9

No sé si vas a obtener mucho más rápido que eso debido a toda la cosa "optimizado para leer, no escribir".

Pero si se lee a través de this thread hay algunas sugerencias:

  • lotes hasta escribe (que está haciendo). No estoy seguro de lo que necesita para cerrar y volver a abrir la sesión, sin embargo, que sólo debe ser capaz de llamar SaveChanges()
  • Establecer el modo de transacción para perezosos (Raven/TransactionMode)
  • ¿Las importaciones de forma asíncrona, es decir, de varios hilos

otra cosa que puede probar es la embedded mode, es decir, cambiar la sesión a

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

Esto no pasa por el tráfico HTTP e inserta documentos directamente, ver the docs de más información.

+0

Intenté todo esto y la ganancia de rendimiento no fue notoria. Supongo que RavenDB es demasiado lento para mis escenarios de uso (escribir pesado). Te daré la respuesta de todos modos, pero el problema es insoluble en este momento. – Chris

+0

Es posible que desee publicar esto en la lista de correo de RavenDB http://groups.google.com/group/ravendb/. Estoy lejos de ser un experto en RavenDB para que puedas obtener una mejor respuesta. –

+6

Hubo algunos ajustes de rendimiento realizados para escribir escenarios pesados ​​a principios de 2011. Probablemente obtendrás mejores resultados ahora. –

Cuestiones relacionadas