Almacén de datos en memoria en Haskell

9

Quiero implementar un almacén de datos en memoria para un servicio web en Haskell. Quiero ejecutar transacciones en la STMmónada.

Cuando busco en Google Hashell Steam Table solo obtengo esto: Data. BTree. HashTable. STM.el nombre del módulo y las complejidades sugieren que esto se implementa como un árbol. Creo que una matriz debería ser más eficiente para tablas hash mutables.

¿Hay alguna razón para evitar usar una matriz para una STMtabla hash? ¿Gano algo con esta tabla de hash de vapor o debería usar una referencia de vapor para una IntMap?

Simon Bergot
fuente
Tenga en cuenta que si usa `TVar IntMap
Daniel Gratzer
@jozefg, ¿qué quieres decir?
Simon Bergot
Oh, lo siento, aparentemente perdí el resto de eso, iba a decir que obtendrás un paralelismo horrible porque se modifica Store ! blahy Store ! baztendrá que ser secuencial
Daniel Gratzer
Cuando dices "un almacén de datos en memoria", ¿te refieres a algo como el estado ácido ?
Ptharien's Flame
@ Ptharien'sFlame Estoy buscando algo realmente más simple que eso. En realidad estoy buscando un mapa mutable simple que se ejecute en la mónada stm. Sé que tengo varias opciones para esto, y estoy tratando de evaluar cuál es mejor.
Simon Bergot

Respuestas:

1

El problema con una implementación de tabla hash basada directamente en una matriz es que algunas de las operaciones en ella inevitablemente requerirán cambiar el tamaño de la matriz de tiempo lineal (es decir, crear una matriz más grande / más pequeña y copiar todos los datos en ella). Existen múltiples algoritmos estándar que abordan este problema, como el hash lineal o el hash de cuco .

No hace mucho tiempo , surgió otro algoritmo llamado Hash Array Mapped Trie , que ganó una gran popularidad en lenguajes funcionales como Clojure, Scala y, por supuesto, Haskell (con las bibliotecas de "contenedores no ordenados" y "hamtmap") debido al soporte de persistentes estructuras de datos.

No hace mucho tiempo, lancé una biblioteca de contenedores especializados en STM basada en ese algoritmo llamado "contenedores-stm", que debería adaptarse perfectamente a su tarea. También puede consultar una publicación de blog introductoria , que cubre una motivación detrás de la biblioteca y proporciona puntos de referencia.

Nikita Volkov
fuente
¡Gracias por responder! No he probado tu paquete pero parece interesante. Lo comprobaré más tarde, pero en función de su publicación, estoy listo para creer que se ajusta a mi objetivo inicial.
Simon Bergot
1

La implementación a la que hace referencia es parte de un paquete para implementar un B-Tree concurrente. HashTable en sí se implementa como una matriz de TVars de objetos Data.Map.

Los valores de complejidad citados son el peor de los casos . Recuerde que las tablas hash son generalmente el peor caso de O (N) para búsqueda, inserción y eliminación. El uso de Map para los depósitos lo reduce a O (log (N)).

usuario2313838
fuente