Я проектирую базу данных объектов в памяти для очень конкретного случая использования. Это один писатель, но должен поддерживать эффективное одновременное чтение. Чтения должны быть изолированными. Нет языка запросов, база данных поддерживает только:
- получить объект / -ы по атрибуту / набору атрибутов (например, может быть поддержка выражений
x.count < 5
) - получить атрибут объекта
Запрос - это императивный скрипт, составленный из произвольного числа вышеуказанных операций. Размер данных будет << памятью, поэтому все объекты и индексы по большинству атрибутов должны удобно размещаться без замены.
Что мне нужно, так это структура данных для индекса атрибута объекта, которая может быть O (n) при записи, не поддерживать параллелизм записи, но должна идеально поддерживать O (1) снимки (возможно, копирование при записи) и доступ O (logN). В идеале это позволило бы обеспечить высокий параллелизм при чтениях с максимальным структурным разделением между версиями.
Я смотрел на CTries , Concurrent BST и Conclayrent Splay Trees, но я не уверен, действительно ли я смотрю в правильном направлении здесь. Вышеуказанные структуры уделяют большое внимание сложности вставок, которые меня не интересуют.
Вопрос : есть ли известная структура данных, которая хорошо подходит для моего варианта использования из коробки?
РЕДАКТИРОВАТЬ : после некоторых размышлений кажется, что устойчивое дерево BST / Splay будет работать. Автор обновляет «главную» копию, а запросы получают дерево с начала выполнения и выбрасывают его после завершения. Однако мне все еще интересно, есть ли лучшее решение.
Ответы:
Используйте любую постоянную / неизменную (т. Е. Функциональную) древовидную структуру данных. Ключ получает правильную блокировку, как отметил @Raphael в комментариях.
Приятной особенностью функциональных / постоянных древовидных структур данных является то, что вы получаете «снимки» бесплатно. Предположим, вы используете treap (рандомизированное двоичное дерево поиска) для своей структуры данных. Вот пример того, что написано на Go: https://github.com/steveyen/gtreap . Автор описывает это так:
Вы используете блокировку для защиты указателя на корень. Поскольку структура данных является неизменяемой, чтение может выполняться одновременно, и вы можете сохранять указатели на старые снимки. Чтение это:
Несмотря на то, что поиск может занять некоторое время, вы удерживаете блокировку только при копировании указателя, поэтому поиск может выполняться одновременно.
Запись это:
В этой версии записи должны удерживать блокировку в течение всего процесса создания новой версии дерева. Вы можете улучшить производительность чтения (за счет иногда неудачной транзакции записи), изменив запись на что-то вроде этого:
Возможно, вам удастся добиться даже немного лучшего (сделать его «свободным от блокировки»), если ваш язык программирования имеет атомарные переменные с атомарной операцией сравнения и замены. (Например, используя C ++ 11.
atomic<T*>
)источник
Microsoft опубликовала подробности о своей новой базе данных в памяти, у нее есть индексы, которые не блокируют чтения во время записи.
Например:
См. Http://research.microsoft.com/en-us/projects/main-memory_dbs/ для списка их публикаций.
источник