Archivio dati in memoria in Haskell


9

Voglio implementare un archivio dati in memoria per un servizio Web in Haskell. Voglio eseguire transazioni nella STMmonade.

Quando google hash table steam Haskell ottengo solo questo: Data. BTree. HashTable. STM.il nome del modulo e le complessità suggeriscono che questo è implementato come un albero. Penserei che un array dovrebbe essere più efficiente per le tabelle hash mutabili.

C'è un motivo per evitare di usare un array per una STMtabella hash? Guadagno qualcosa con questa tabella di hash del vapore o devo semplicemente usare un riferimento di vapore per un IntMap?


Nota, se usi `TVar IntMap
Daniel Gratzer il

@jozefg che vuoi dire?
Simon Bergot,

Oh scusa, a quanto pare ho perso il resto, stavo per dire che otterrai un pessimo parallelismo perché modificando Store ! blahe Store ! bazdovrai essere sequenziale
Daniel Gratzer,

Quando dici "un archivio dati in memoria", intendi qualcosa di simile allo stato acido ?
Ptharien's Flame,

@ Ptharien'sFlame Sto cercando qualcosa di veramente più semplice di così. In realtà sto cercando una semplice mappa mutabile che corre nella monade stm. So di avere diverse opzioni per questo e sto provando a valutare quale sia la migliore.
Simon Bergot,

Risposte:


1

Il problema con un'implementazione della tabella hash basata direttamente su un array è che alcune delle operazioni su di esso richiederanno inevitabilmente il ridimensionamento lineare dell'array di tempo (cioè creando un array più grande / più piccolo e copiando tutti i dati su di esso). Esistono più algoritmi standard che affrontano questo problema, come Linear Hashing o Cuckoo Hashing .

Non molto tempo fa è emerso un altro algoritmo chiamato Hash Array Mapped Trie , che ha guadagnato una grande popolarità attraverso linguaggi funzionali come Clojure, Scala e, naturalmente, Haskell (con le librerie "unordered-containers" e "hamtmap") grazie al supporto di persistente strutture di dati.

Non molto tempo fa ho rilasciato una libreria di contenitori specializzata STM basata su quell'algoritmo chiamato "stm-containers", che dovrebbe adattarsi perfettamente al tuo compito. Puoi anche consultare un post di blog introduttivo , che illustra una motivazione alla base della libreria e fornisce parametri di riferimento.


Grazie per la risposta! Non ho testato il tuo pacchetto ma sembra interessante. Lo controllerò più tardi, ma in base al tuo post sono pronto a credere che si adatti al mio obiettivo iniziale.
Simon Bergot,

1

L'implementazione a cui fai riferimento fa parte di un pacchetto per l'implementazione di un B-Tree concorrente. La stessa HashTable è implementata come una matrice di TVars di oggetti Data.Map.

I valori di complessità indicati sono nel caso peggiore . Ricorda che gli hashtable sono in genere il caso peggiore O (N) per la ricerca, l'inserimento e l'eliminazione. L'uso di Map per i bucket lo porta a O (log (N)).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.