Я проектирую базу данных объектов в памяти для очень конкретного случая использования. Это один писатель, но должен поддерживать эффективное одновременное чтение. Чтения должны быть изолированными. Нет языка запросов, база данных поддерживает только:
- получить объект / -ы по атрибуту / набору атрибутов (например, может быть поддержка выражений
x.count < 5
) - получить атрибут объекта
Запрос - это императивный скрипт, составленный из произвольного числа вышеуказанных операций. Размер данных будет << памятью, поэтому все объекты и индексы по большинству атрибутов должны удобно размещаться без замены.
Что мне нужно, так это структура данных для индекса атрибута объекта, которая может быть O (n) при записи, не поддерживать параллелизм записи, но должна идеально поддерживать O (1) снимки (возможно, копирование при записи) и доступ O (logN). В идеале это позволило бы обеспечить высокий параллелизм при чтениях с максимальным структурным разделением между версиями.
Я смотрел на CTries , Concurrent BST и Conclayrent Splay Trees, но я не уверен, действительно ли я смотрю в правильном направлении здесь. Вышеуказанные структуры уделяют большое внимание сложности вставок, которые меня не интересуют.
Вопрос : есть ли известная структура данных, которая хорошо подходит для моего варианта использования из коробки?
РЕДАКТИРОВАТЬ : после некоторых размышлений кажется, что устойчивое дерево BST / Splay будет работать. Автор обновляет «главную» копию, а запросы получают дерево с начала выполнения и выбрасывают его после завершения. Однако мне все еще интересно, есть ли лучшее решение.