Given (descrizione semplificata)sostituzione .net dizionario
Uno dei nostri servizi ha un sacco di istanze in memoria. Circa l'85% sono unici. Abbiamo bisogno di un molto veloce accesso basato su chiave a questi elementi come sono interrogati molto spesso in una singola pila/chiamata. Questo contesto unico è estremamente ottimizzato per le prestazioni.
Così abbiamo iniziato a inserirli in un dizionario. La performance è stata ok.
L'accesso agli articoli il più velocemente possibile è la cosa più importante in questo caso. Si garantisce che non ci siano operazioni di scrittura quando si verificano letture.
Problema
Nel frattempo abbiamo raggiunto i limiti del numero di elementi di un dizionario in grado di memorizzare.
Die Arraydimensionen haben den unterstützten Bereich überschritten.
bei System.Collections.Generic.Dictionary`2.Resize(Int32 newSize, Boolean forceNewHashCodes)
bei System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
che si traduce in The array dimensions have exceeded the supported range
.
Soluzioni come Memcached sono in questo caso specifico troppo lente. È un caso d'uso isolato molto specifico incapsulato in un singolo servizio
Quindi stiamo cercando una sostituzione del dizionario per questo specifico scenario.
Attualmente non riesco a trovarne uno che supporti questo. Mi sto perdendo qualcosa? Qualcuno può indicarmi uno?
In alternativa, se non ne esiste nessuno, stiamo pensando di implementarne uno da soli.
Abbiamo pensato a due possibilità. Costruiscila da zero o avvolgendo più dizionari.
Wrapping dizionari multipli
Quando un elemento viene cercato potremmo avere uno sguardo alla chiavi HasCode e utilizzare il suo numero di partenza come un indice per un elenco di involucri dizionari. Anche se questo sembra essere facile mi odora e significherebbe che l'hashcode viene calcolato due volte (una volta da noi una sola volta dal dizionario interno) (questo scenario è davvero molto performante).
So che scambiare un tipo di base come il dizionario è l'ultima possibilità assoluta e voglio evitarlo. Ma al momento sembra che non ci sia modo di rendere gli oggetti più unici o di ottenere le prestazioni di un dizionario da un database o di salvare le prestazioni da qualche altra parte.
Sono anche consapevole di "essere consapevoli delle ottimizzazioni", ma una prestazione inferiore avrebbe colpito molto seriamente i requisiti aziendali.
Qual è stato il limite raggiunto? 2^31? –
Non sono sicuro che sia il conteggio o la dimensione dell'oggetto dell'elemento, i ', attualmente aggiungendo qualche codice di registrazione a questo. Ma a causa delle circostanze dei servizi, non riesco a ottenere risultati molto rapidi. –
Inoltre, controlli l'implementazione dei tipi che stai aggiungendo al dizionario? In tal caso, è possibile memorizzare almeno il codice hash in modo che non venga ricalcolato inutilmente. –