Как ограничить сброс базы данных на диск? - PullRequest
6 голосов
/ 21 апреля 2009

Я использую базу данных sqlite на моей встроенной платформе linux arm9. Я хочу уменьшить количество записей в базу данных на диске, потому что мой диск является флэш-памятью и требует минимальных циклов записи. Поэтому я попытался увеличить SQLITE_DEFAULT_CACHE_SIZE до 5000. Моя цель состояла в том, чтобы записывать данные в кеш, а когда кеш заполняется, автоматически записываться на диск. Но, увеличив значение SQLITE_DEFAULT_CACHE_SIZE, я не могу подтвердить, работает это или нет. Я не вижу никаких изменений в операциях! Мой путь правильный? Кто-нибудь может дать мне несколько советов? Спасибо Aneesh

Ответы [ 4 ]

3 голосов
/ 26 апреля 2009

SQLite для ACID db сбрасывается при каждой фиксации ИЛИ при каждой вставке / удалении / обновлении, не обернутой транзакцией. Используйте транзакции для группировки операций ИЛИ ВЫКЛЮЧИТЕ ACIDity и установите PRAGMA синхронный = OFF.

"PRAGMA синхронный = ВЫКЛ", и SQLite вообще не сбрасывает данные (фактически оставляя это для кэша ОС)

SQLITE_DEFAULT_CACHE_SIZE - ТОЛЬКО для размера кэша. И кеш используется ТОЛЬКО для чтения данных.

Существует еще один вариант - вы можете реализовать собственный слой VFS и вообще запретить сохранение страниц до того, как ваш собственный буфер будет заполнен. http://www.sqlite.org/c3ref/vfs.html

Но я уверен, что sync = off (или гораздо лучше для использования транзакций) сделает работу достаточно хорошо (имея хороший шанс испортить вашу базу данных в случае сбоя питания или полного сброса для sync = off).

Еще один совет - поместить ЖУРНАЛ в память или полностью его отключить. Опять же - это отключает кислотность, но это также удаляет некоторые касания диска.

2 голосов
/ 21 апреля 2009

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

0 голосов
/ 21 апреля 2009

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

0 голосов
/ 21 апреля 2009

У вас есть исходный код для SQLite - почему бы просто не использовать его для записи интересующей вас информации.

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