#sqlite #vacuum
Вопрос:
Я использую базу данных sqlite в памяти для некоторой организации очередей между несколькими потоками, и поэтому у нас много операций записи, чтения и удаления. Но в базе данных никогда не бывает больше нескольких КБ за раз. Теперь некоторые клиенты жалуются на использование памяти после более длительного использования, и мне интересно, влияют ли фрагментация на базы данных sqlite в памяти? Есть ли необходимость в ВАКУУМИРОВАНИИ баз данных в памяти?
Эта база данных используется несколькими потоками, и я не могу заблокировать их все для некоторого ВАКУУМА. Или все соединения просто ждут, пока VACUUM не завершится, а затем возвращаются как обычно? И что произойдет, если другой поток просто выполняет транзакцию, пока я запускаю VACUUM из своего потока?
Примечание: я уже проверяю наличие утечек памяти в своей программе, но это еще один вариант, который я хочу рассмотреть, потому что valgrind на данный момент не находит никаких проблем. И такое использование памяти хранилища sqlite, конечно, не является утечкой памяти традиционным способом.
Комментарии:
1. Можете ли вы предоставить свои доказательства того, что «в базе данных никогда не бывает больше нескольких КБ за раз»? Особенно для случаев относительно длительного времени выполнения.
2. @Yunnosch Дело в том, что эта таблица содержит задания, которые обрабатываются потоками. Если ничего не делать, таблица пуста. Таким образом, только условия высокой нагрузки могут резко увеличить это. Но это не тот случай, когда клиенты жалуются.
3. «Если ничего не делать, таблица пуста». Однако это не означает, что в этом случае потребление памяти базой данных приближается к нулю. Необходимо учитывать метаданные. Также в зависимости от структуры и механизмов могут быть устаревшие записи, которые занимают память, но будут регистрироваться как «пустые» в вашем заявлении. Итак, хотя ваши рассуждения кажутся убедительными, я снимаю сделанные вами измерения.
4. Вы можете выполнить некоторое протоколирование
sqlite3_memory_used()
иsqlite3_memory_highwater()
посмотреть, отвечает ли sqlite за это увеличение памяти.5. @RomanPavelka К сожалению, нет. Мы не можем воспроизвести сами, и клиенты не дали нам возможности для дальнейшей проверки. Некоторые из них теперь перезапускаются ежедневно, что воссоздает таблицы памяти и решает проблему. Но мы не очень довольны этим…