7

Мне нужно написать приложение на C++, которое читает и записывает большие объемы данных (больше, чем доступная оперативная память), но всегда в последовательном порядке.Ищите удобное встроенное хранилище ключей для C++

Чтобы сохранить данные в будущем и легко документировать, я использую протокол протоколов. Однако протокол протокола не обрабатывает большие объемы данных.

Мое предыдущее решение состояло в создании одного файла на единицу данных (и хранения их всех в одном каталоге), но это, по-видимому, не особенно масштабируемо.

На этот раз я хотел бы попробовать использовать встроенную базу данных. Чтобы иметь аналогичную функциональность, мне нужно только сохранить ассоциации key-> values ​​(поэтому sqlite кажется излишним). Значения будут бинарной сериализацией, выводимой из буфера протокола.

Я ожидаю, что база данных будет управлять «тем, что нужно хранить в памяти, что перемещать на диск asp», «как эффективно хранить большой объем данных на диске», и в идеале, для оптимизации моего последовательного чтения шаблонов (прочитав перед собой следующие записи).

Поиск альтернатив Я был удивлен отсутствием альтернатив. Я не хочу держать базу данных в отдельном процессе, потому что мне не нужно это разделение (это исключает redis).

Единственный вариант, который я нашел, это Berkeley DB, но он имеет неприятный низкий уровень C api. Тогда лучший вариант, который я нашел, был stldb4 поверх Berkeley DB. API кажется довольно приятным и соответствует моим потребностям.

Однако я беспокоюсь. stldb4 кажется странным (он имеет зависимости от материала libferris), неподдерживаемое решение (последний релиз год назад), для проблемы я бы, хотя и довольно распространен.

У кого-нибудь из вас есть лучшее предложение о том, как справиться с этой проблемой?

Спасибо за ваши ответы.

ответ

5

Я думаю, что нашел ответ на свою проблему.

я не заметил, что Berkeley DB обеспечивает два API-интерфейсы для C++:

  • ванили C как API
  • STL API

Этот STL API обеспечивает STL совместимые векторы и карты абстракции, которые дают прямой доступ к базе данных. Таким образом можно сделать value = data_container[key].

Это, кажется, лучшее решение для меня; используя Berkeley DB STL API непосредственно вместе с буферами протоколов.

1

BerkleyDB, похоже, соответствует вашим потребностям. Конечно, его API немного неудобен, но если вы скорее получите хороший API, то SQLite может быть лучшим решением, хотя я думаю, что его производительность может быть не такой хорошей.

Смежные вопросы