Estou projetando um banco de dados de objetos na memória para um caso de uso muito específico. É um escritor único, mas deve suportar leituras simultâneas eficientes. As leituras devem ser isoladas. Não há linguagem de consulta, o banco de dados suporta apenas:
- obter objetos / s por atributo / conjunto de atributos (pode haver suporte para expressões, por exemplo
x.count < 5
) - obter atributo do objeto
Uma consulta é um script imperativo composto por um número arbitrário das operações acima. O tamanho dos dados será << memória; portanto, todos os objetos e índices na maioria dos atributos devem caber confortavelmente sem troca.
O que eu preciso é de uma estrutura de dados para o índice de atributo do objeto, que pode ser O (n) em gravações, não suporta simultaneidade de gravação, mas deve suportar idealmente O (1) instantâneos (talvez cópia na gravação) e acesso O (logN). Idealmente, isso permitiria alta simultaneidade nas leituras com o compartilhamento estrutural máximo entre as versões.
Eu estava olhando para CTries , BSTs simultâneos e árvores de exibição simultâneas, mas não tenho certeza se estou realmente olhando na direção certa aqui. As estruturas acima prestam muita atenção à complexidade das inserções com as quais não me importo.
A pergunta : existe uma estrutura de dados conhecida que seja adequada para o meu caso de uso imediatamente?
EDIT : depois de pensar um pouco mais, parece que uma árvore BST / Splay persistente funcionaria. O gravador atualizaria a cópia 'mestre' e as consultas obteriam a árvore a partir do início da execução e a jogariam fora depois que terminassem. No entanto, ainda estou interessado se houver uma solução melhor.