Я должен записать приложение C++, которое читает и пишет большие объемы данных (больше, чем доступная RAM), но всегда последовательным способом.
Для удержания данных соответствующее требованиям завтрашнего дня и легкое для документирования пути, я использую Буфер Протокола. Буфер протокола однако не обрабатывает большие объемы данных.
Мое предыдущее решение состояло при создании одного файла на блок данных (и сохраните их всех в одном каталоге), но это кажется не особенно масштабируемым.
На этот раз я хотел бы попытаться использовать встроенную базу данных. Чтобы иметь схожую функциональность, я только должен сохранить ключ->, оценивает ассоциации (таким образом sqlite, кажется излишеством). Значения будут двоичным выводом сериализации от Буфера Протокола.
Я ожидаю, что база данных справится, "что сохранить в памяти, что переместиться в дисковую проблему" asp, "как эффективно сохранить большой объем данных по диску" проблема, и идеально, для оптимизации моих последовательных шаблонов чтения (путем чтения заранее следующих записей).
Поиск альтернатив я был удивлен от отсутствия альтернатив. Я не хочу сохранять базу данных в отдельном процессе, потому что мне не нужно это разделение (это исключает советы).
Единственной опцией, которую я нашел, был Беркли DB, но это имеет неприятный низкоуровневый C API. Затем наилучшим вариантом, который я нашел, был stldb4 сверху Беркли DB. API кажется довольно хорошим и соответствует моим потребностям.
Однако я волнуюсь. stldb4 кажется странным (он имеет зависимости от материала libferris), несохраняемое решение (последний выпуск один год назад), для проблемы, которую я имел бы, хотя быть довольно распространенным.
У какого-либо из Вас есть лучшее предложение о том, как управлять этой проблемой?
Спасибо за Ваши ответы.
Думаю, я нашел ответ на свою проблему.
Я не заметил, что Berkeley DB предоставляет два API для C ++:
Этот STL API предоставляет STL-совместимые векторы и абстракции карты, которые предоставляют прямой доступ к базе данных. Таким образом становится возможным выполнение value = data_container [key]
.
Это кажется мне лучшим решением; используя Berkeley DB STL API напрямую вместе с буферами протокола.
BerkleyDB , кажется, соответствует вашим потребностям. Конечно, его API немного неудобен, но если вы предпочитаете хороший API, SQLite может быть лучшим решением, хотя я думаю, что его производительность может быть не такой хорошей.