список / карта пар ключ-значение, заархивированных файлом на диске - PullRequest
3 голосов
/ 12 января 2012

Мне нужно составить список пар ключ-значение (аналогично std::map<std::string, std::string>), которые хранятся на диске, и могут быть доступны нескольким потокам одновременно. ключи могут быть добавлены или удалены, значения могут быть изменены, ключи являются уникальными. Возможно, все это может не поместиться в память сразу, поэтому обновления карты должны быть сохранены на диск.

Проблема в том, что я не уверен, как подойти к этой проблеме. Я понимаю, как справляться с проблемами многопоточности, но я не уверен, какая структура данных подходит для хранения данных на диске. Практически все, что я могу придумать, может кардинально изменить структуру и вызвать существенную перезапись дискового хранилища, если я подойду к проблеме лицом к лицу. С другой стороны, реляционные базы данных и реестр Windows решают эту проблему, поэтому должен быть способ ее решения.

Есть ли структура данных, которая "сделана" для такого сценария?
Или я просто использую любую традиционную структуру данных (например, деревья или списки пропусков) и создаю какой-то «диспетчер памяти» («куча» на диске), который распределяет порции дискового пространства, загружает их в память по запросу и выгружает их на диск, когда это необходимо? Я могу себе представить, как написать такую ​​«кучу на основе диска», но это решение не очень элегантно, особенно когда вы добавляете многопоточность к изображению.

Идеи

Ответы [ 3 ]

1 голос
/ 12 января 2012

Если вам нужно только выполнять поиск (и вставку, удаление) по ключу, а не более сложные запросы на основе полей, BDB может быть лучшим выбором для вашего приложения.

1 голос
/ 12 января 2012

Структура данных, которая «сделана» для вашего сценария: B-дерево или его варианты, например B + tree .

1 голос
/ 12 января 2012

Короче говоря: когда вы записываете что-то на диск, вы больше не имеете дело с «структурами данных» - вы имеете дело с «сериализацией» и «базами данных».

C ++ STL и его структуры данных на самом деле не решают эти проблемы, но, к счастью, тысячи программистов уже обращались к ним тысячи раз. Скорее всего, 99,9% уже написали что-то, что будет хорошо работать для вас.

Исходя из вашего описания, sqlite звучит так, как будто это был бы достойный, сбалансированный выбор для вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...