C или C ++ - динамически растущая / уменьшающаяся разделяемая память на диске - PullRequest
1 голос
/ 26 декабря 2009

У меня есть несколько процессов fastcgi, которые должны обмениваться данными.

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

Мой вопрос (будучи новичком в C / ++):

Существуют ли какие-либо подходы или библиотеки, которые могут помочь мне решить эту довольно сложную проблему?

Можно ли использовать mmap() с общей памятью, учитывая требование уничтожения неактивных данных сеанса?

Ответы [ 2 ]

3 голосов
/ 26 декабря 2009

После вашего комментария к bmargulies я должен предупредить вас, что я сам пытался сделать то, что вы описываете, и обнаружил, что пишу базу данных ACID. Напомним, что вы попросили:

  • Статистическое кеширование
  • постоянство данных
  • обмен данными между процессами

Это роль системы баз данных. Гораздо лучше использовать один, написанный другими. IMO ваш выбор sqlite и Беркли-дБ. . Sqlite не предназначен для параллельного доступа, с другой стороны, berkeley-db очень масштабируем , однако в качестве модели данных он использует словарь строк и строк.

BDB может иметь базы данных полностью в памяти или обычным способом, который сериализуется на диск и кэшируется в памяти. Вы также можете настроить семантику ACID в соответствии с вашими конкретными потребностями - то есть вы можете отключить долговременные записи, и это даст вам мгновенные характеристики записи, в то же время пожертвовав стойкими данными.

Существует множество более сложных решений, но они предназначены для решения реальных проблем, т. Е. Вам необходимо создать кластер.

3 голосов
/ 26 декабря 2009

Ну, большинство людей используют для этого базу данных SQL и либо реализуют кеш, либо зависят от базы данных для выполнения недавно использованного кэширования. Неактивное уничтожение будет задачей фонового потока. При перезагрузке вам необходимо очистить остатки от старых мертвых сессий.

Вес решения - забавная вещь. Если вы используете базу данных, у вас, возможно, будет намного меньше кода, и что-то среднее между дельфином и голубым китом, плавающим позади. Если вы создадите механизм персистентности с нуля, у вас будет много кода.

Взгляните на bdb как на промежуточную альтернативу.

...