Использование анонимной памяти SQLite

65
6

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


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


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


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


Q. Есть ли способ найти размер базы данных, когда она находится в памяти?


Когда я создаю БД на диске, размер БД составляет ~ 40 МБ. Но все же использование памяти в приложении остается очень высоким.
Q. Есть ли причина для этого высокого использования. Все буферы очищены и как сказано до того, как БД не находится в памяти?


Любая помощь будет глубоко оценена.


Спасибо и с уважением
Сэчин

спросил(а) 2021-01-19T15:28:52+03:00 9 месяцев назад
1
Решение
102

Несколько вопросов приходят на ум...


Каков размер каждой записи?

У вас есть средства обнаружения утечки памяти для вашей платформы?


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

ответил(а) 2021-01-19T15:28:52+03:00 9 месяцев назад
46

Смотрите это:


PRAGMA shrink_memory

Эта прагма вызывает соединение с базой данных, на которое оно вызывается, чтобы освободить столько памяти, сколько может, вызывая sqlite3_db_release_memory().

ответил(а) 2021-01-19T15:28:52+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема