Magasin de données en mémoire à Haskell


9

Je souhaite implémenter une banque de données en mémoire pour un service Web à Haskell. Je veux exécuter des transactions dans la STMmonade.

Lorsque je google table de hachage sur Steam Haskell, je n'obtiens que ceci: Data. BTree. HashTable. STM.Le nom et la complexité du module suggèrent que cela est implémenté sous forme d'arbre. Je pense qu'un tableau devrait être plus efficace pour les tables de hachage mutables.

Y a-t-il une raison pour éviter d'utiliser un tableau pour une STMtable de hachage? Dois-je gagner quelque chose avec cette table de hachage à vapeur ou dois-je simplement utiliser une référence de vapeur à un IntMap?


Remarque, si vous utilisez `TVar IntMap
Daniel Gratzer

@jozefg que voulez-vous dire?
Simon Bergot

Oh désolé, apparemment j'ai perdu le reste, j'allais dire que vous obtiendrez un parallélisme merdique parce que la modification Store ! blahet Store ! bazdevra être séquentielle
Daniel Gratzer

Lorsque vous dites "un magasin de données en mémoire", voulez-vous dire quelque chose comme un état acide ?
Ptharien's Flame

@ Ptharien'sFlame Je cherche quelque chose de vraiment plus simple que ça. En fait, je recherche une simple carte mutable qui s'exécute dans la monade stm. Je sais que j'ai plusieurs options pour cela, et j'essaie d'évaluer laquelle est la meilleure.
Simon Bergot

Réponses:


1

Le problème avec une implémentation de table de hachage basée directement sur un tableau est que certaines opérations sur celui-ci nécessiteront inévitablement un redimensionnement du tableau de temps linéaire (c'est-à-dire, la création d'un tableau plus grand / plus petit et la copie de toutes les données). Il existe plusieurs algorithmes standard qui abordent ce problème, comme le hachage linéaire ou le hachage de coucou .

Il n'y a pas si longtemps, un autre algorithme nommé Hash Array Mapped Trie a émergé, qui a gagné une grande popularité dans les langages fonctionnels comme Clojure, Scala et, bien sûr, Haskell (avec les bibliothèques "unordered-containers" et "hamtmap") en raison du support de persistant structures de données.

Il n'y a pas longtemps, j'ai publié une bibliothèque de conteneurs spécialisés STM basée sur cet algorithme nommé "conteneurs stm", qui devrait parfaitement s'adapter à votre tâche. Vous pouvez également consulter un article de blog d'introduction , couvrant une motivation derrière la bibliothèque et fournissant des repères.


Merci d'avoir répondu! Je n'ai pas testé votre package mais il semble intéressant. Je vais le vérifier plus tard, mais sur la base de votre message, je suis prêt à croire qu'il correspond à mon objectif initial.
Simon Bergot

1

L'implémentation que vous référencez fait partie d'un package pour implémenter un B-Tree simultané. Le HashTable lui-même est implémenté comme un tableau de TVars d'objets Data.Map.

Les valeurs de complexité citées sont le pire des cas . N'oubliez pas que les tables de hachage sont généralement le pire des cas O (N) pour la recherche, l'insertion et la suppression. L'utilisation de Map pour les compartiments la ramène à O (log (N)).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.