Che livello di prestazioni mi devo aspettare da RavenDB?
-
02-10-2019 - |
Domanda
Ho cercato per un buon database NoSQL per alcuni dei nostri progetti per un bel po 'di tempo e di recente ho scoperto RavenDB che sembra abbastanza impressionante dal punto di vista di supporto .NET, così ho deciso di provare e scrivere un po' di riferimento . Primo ordine del giorno stava testando inserto velocità, utilizzando il seguente codice:
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;
}
}
L'uscita è la seguente:
Processed 10,000 records
Time elapsed: 9,531 ms
Records / sec: 1,049
Press any key to continue . . .
Questo è su una macchina relativamente veloce (3 GHz, 2GB di RAM con Windows 7)
Chiamatemi pazzo, ma 1000 inserti / sec è terribilmente lento, soprattutto per i documenti che contengono solo due campi. E 'questo che ci si aspetta? So RavenDB è ottimizzato per la legge, non scrive, ma questo è piuttosto male.
Soluzione
Non so se avete intenzione di ottenere molto più veloce di quello dovuto a tutta la "ottimizzato per legge, non scrivere" cosa.
Ma se si leggono attraverso questa discussione ci sono alcuni suggerimenti:
- Batch fino scritture (che si sta facendo). Non sono sicuro che è necessario chiudere e quindi riaprire la sessione, però, si dovrebbe solo essere in grado di chiamare
SaveChanges()
- Impostare la modalità di transazione per pigri (
Raven/TransactionMode
) - Fare le importazioni in modo asincrono, cioè da diversi thread
Un altra cosa che si può provare è il embedded mode
, cioè cambiare la sessione di
var documentStore = new DocumentStore { DataDirectory = "path/to/database/directory" };
documentStore.Initialize();
Questa bypassa i documenti del traffico HTTP e inserti direttamente, vedi la documentazione per maggiori informazioni.