sqlite sqlite3_close () не освобождает приобретенную память - PullRequest
2 голосов
/ 16 ноября 2010

Мы пытаемся интегрировать SQLite в наше приложение и пытаемся заполнить его как кэш. Мы планируем использовать его как базу данных в памяти. Используя это в первый раз. Наше приложение основано на C ++.

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

Количество полей: 60 Количество записей: 1,00,000

Когда начинается заполнение данными, объем памяти приложения резко возрастает до ~ 1,4 ГБ с 120 МБ. В настоящее время наше приложение находится в состоянии ожидания и не выполняет каких-либо серьезных операций. Но, как правило, после запуска операций запускается использование памяти. Теперь с SQLite, как в Memory DB, и с таким высоким использованием памяти, мы не думаем, что сможем поддерживать эти многочисленные записи.

Теперь, когда я закрываю БД с помощью sqlite3_close (), память не освобождается? Я даже пытался сбросить стол, но память все еще остается высокой? Что нужно сделать, чтобы sqlite освободил накопленную память, а память приложений вернулась в нормальное состояние?

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

Забудьте sqlite часть вашего вопроса, так как эта проблема относится к любому пользовательскому процессу в Linux.

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

Однако на помощь приходит виртуальная память. Существует разница между размером процесса и размером резидентного набора в ядре (sz и rss соответственно, как показано ps -F). Для процессов, которые имеют память, к которой недавно не обращались, rss может быть намного меньше, чем sz, а для некоторых процессов, которые просто ждут, что что-то произойдет (например, неактивные процессы getty), rss может быть нулевым, что означает весь процесс адресное пространство было заменено, чтобы активные программы могли использовать память.

Возвращаясь к вашему вопросу, вы не объясняете, почему вы хотите использовать базу данных в памяти, но в любом случае вы запускаете эту таблицу, которая будет на диске либо явно через sqlite с дисковым хранилищем, либо через систему виртуальной памяти.

0 голосов
/ 16 ноября 2010

Я думаю, проблема решена.После каждого выполнения запроса я не выполнял sqlite3_finalize ().Как только это было сделано, объем памяти резко сократился.

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