Estoy diseñando una base de datos de objetos en memoria para un caso de uso muy específico. Es un escritor único, pero debe admitir lecturas concurrentes eficientes. Las lecturas deben estar aisladas. No hay lenguaje de consulta, la base de datos solo admite:
- obtener objeto / -s por atributo / conjunto de atributos (puede haber soporte para expresiones, por ejemplo
x.count < 5
) - obtener el atributo del objeto
Una consulta es un script imperativo compuesto por un número arbitrario de las operaciones anteriores. El tamaño de los datos será << memoria, por lo que todos los objetos e índices de la mayoría de los atributos deben ajustarse cómodamente sin intercambiarse.
Lo que necesito es una estructura de datos para el índice de atributos del objeto, que puede ser O (n) en escrituras, no admite concurrencia de escritura, pero idealmente debería admitir instantáneas O (1) (tal vez copiar en escritura) y acceso O (logN). Idealmente, permitiría una alta concurrencia en las lecturas con el máximo intercambio estructural entre las versiones.
Estaba mirando CTries , BST concurrentes y árboles de reproducción simultánea, pero no estoy seguro de si realmente estoy mirando en la dirección correcta aquí. Las estructuras anteriores prestan mucha atención a la complejidad de los insertos que no me importan.
La pregunta : ¿existe una estructura de datos conocida que se ajuste bien a mi caso de uso fuera de la caja?
EDITAR : después de pensar un poco más, parece que un árbol BST / Splay persistente funcionaría. El escritor actualizaría la copia 'maestra' y las consultas obtendrían el árbol al comienzo de la ejecución y lo tirarían después de que hayan terminado. Sin embargo, todavía estoy interesado si hay una mejor solución.