У меня есть программа на C ++, которая может генерировать ОГРОМНОЕ количество данных - миллиарды двоичных записей различного размера, скорее всего, менее 256 байт, но несколько простираются до нескольких К. Большинство записей редко будут программа просматривается после их создания, но некоторые из них будут регулярно доступны и изменены. Невозможно сказать, какие именно, когда они созданы.
Учитывая объем данных, я никак не могу сохранить все это в памяти. Но поскольку данные нужно только проиндексировать и получить к ним доступ по их номеру (64-разрядное целое число), я не хочу получить издержки на полноценную программу базы данных. В идеале я хотел бы рассматривать его как std::map
с его данными, хранящимися на диске до тех пор, пока не будет запрошено.
Есть ли уже написанная библиотека, которая будет делать то, что я ищу, или мне нужно написать ее самостоятельно?
РЕДАКТИРОВАТЬ: После некоторых размышлений я понял, что ответ Роба Уокера содержал правильную точку зрения: мне было бы трудно получить хоть что-то похожее на целостность данных в классе домашнего пивоварения, который я получил от реальная база данных.
Хотя BerkeleyDB (как предлагает RHM) выглядит так, как будто он будет делать именно то, что мы ищем, двойное лицензирование - это головная боль, с которой мы не хотим иметь дело. Когда мы закончим с кодом и сможем доказать, что он извлечет значительную пользу из BerkeleyDB (что, вероятно, будет), мы пересмотрим проблему.
Я посмотрел на предложение Ферруччо о stxxl, но не смог сказать, как он будет обрабатывать прерывание и перезапуск программы (возможно, с изменениями). С таким большим количеством данных я бы не хотел просто отбрасывать то, что он уже выполнил, и начинать каждый раз заново, если можно было бы сохранить некоторые данные.
Итак, мы решили использовать базу данных SQLite, по крайней мере, для начальной разработки. Спасибо всем, кто ответил или проголосовал.