Sto progettando un database di oggetti in memoria per un caso d'uso molto specifico. È un singolo autore, ma deve supportare letture simultanee efficienti. Le letture devono essere isolate. Non esiste un linguaggio di query, il database supporta solo:
- ottenere oggetto / i per attributo / set di attributi (potrebbe esserci supporto per le espressioni, ad es.
x.count < 5
) - ottenere l'attributo dell'oggetto
Una query è uno script imperativo composto da un numero arbitrario delle operazioni precedenti. La dimensione dei dati sarà << memoria, quindi tutti gli oggetti e gli indici sulla maggior parte degli attributi dovrebbero adattarsi comodamente senza scambiare.
Ciò di cui ho bisogno è una struttura di dati per l'indice degli attributi dell'oggetto, che può essere O (n) nelle scritture, non supportare la concorrenza di scrittura, ma dovrebbe supportare idealmente le istantanee O (1) (forse copia su scrittura) e l'accesso O (logN). Idealmente, consentirebbe un'elevata concorrenza sulle letture con la massima condivisione strutturale tra le versioni.
Stavo guardando CTries , Concurrent BSTs e Concurrent Splay Tree ma non sono sicuro di guardare davvero nella giusta direzione qui. Le strutture di cui sopra prestano molta attenzione alla complessità degli inserti di cui non mi interessa.
La domanda : esiste una struttura di dati nota adatta per il mio caso d'uso pronta all'uso?
EDIT : dopo aver pensato un po 'di più sembra che un albero BST / Splay persistente funzionerebbe. Lo scrittore aggiornava la copia "principale" e le query avrebbero ottenuto l'albero dall'inizio dell'esecuzione e l'avrebbero buttato via dopo averlo fatto. Tuttavia, sono ancora interessato se esiste una soluzione migliore.