Je conçois une base de données d'objets en mémoire pour un cas d'utilisation très spécifique. Il s'agit d'un rédacteur unique, mais il doit prendre en charge des lectures simultanées efficaces. Les lectures doivent être isolées. Il n'y a pas de langage de requête, la base de données ne prend en charge que:
- obtenir un objet / -s par attribut / ensemble d'attributs (il peut y avoir un support pour les expressions, par exemple
x.count < 5
) - obtenir l'attribut de l'objet
Une requête est un script impératif composé d'un nombre arbitraire des opérations ci-dessus. La taille des données sera << mémoire, donc tous les objets et indices sur la plupart des attributs devraient s'adapter confortablement sans permutation.
Ce dont j'ai besoin, c'est d'une structure de données pour l'index d'attribut de l'objet, qui peut être O (n) lors des écritures, ne prend pas en charge la concurrence d'accès en écriture, mais devrait idéalement prendre en charge les instantanés O (1) (peut-être copier lors de l'écriture) et O (logN). Idéalement, cela permettrait une concurrence élevée sur les lectures avec un partage structurel maximal entre les versions.
Je regardais les CTries , les BST simultanés et les arbres de jeu simultanés, mais je ne sais pas si je regarde vraiment dans la bonne direction ici. Les structures ci-dessus prêtent beaucoup d'attention à la complexité des inserts qui ne m'intéressent pas.
La question : existe-t-il une structure de données connue qui convient bien à mon cas d'utilisation, prêt à l'emploi?
EDIT : après réflexion, il semble qu'un arbre BST / Splay persistant fonctionnerait. Le rédacteur mettrait à jour la copie «principale» et les requêtes obtiendraient l'arborescence dès le début de l'exécution et la jetteraient une fois qu'elles seraient terminées. Cependant, je suis toujours intéressé s'il y a une meilleure solution.