Ищете простое в использовании встроенное хранилище значений ключей для C ++ - PullRequest
7 голосов
/ 23 июля 2010

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

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

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

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

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

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 23 июля 2010

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

Я не заметил, что Berkeley DB предоставляет два API для C ++:

  • API-интерфейс типа vanilla C
  • и STL API

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

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

2 голосов
/ 29 ноября 2010

Я бы предложил Киотский кабинет .

1 голос
/ 23 июля 2010

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

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