Синхронизация sqlite база данных из памяти в файл

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

Выполнение моих запросов при использовании базы данных файла берет к длинному, и заставляет компьютер отстать.

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

Действительно ли это возможно? Есть ли лучший способ достигнуть этого (можете Вы говорить sqlite соглашаться на диск только после X запросы?).

Я могу решить это с Qt SQL обертка?

8
задан Elazar Leibovich 22 June 2010 в 15:37
поделиться

3 ответа

Предположим, у вас есть база данных на диске под названием disk_logs с таблицей под названием «events» . Вы можете присоединить базу данных в памяти к существующей базе данных:

ATTACH DATABASE ':memory:' AS mem_logs;

Создайте таблицу в этой базе данных (которая будет полностью в памяти) для приема входящих событий журнала:

CREATE TABLE mem_logs.events(a, b, c);

Затем перенесите данные из оперативной памяти таблицу в таблицу на диске во время простоя приложения:

INSERT INTO disk_logs.events SELECT * FROM mem_logs.events;

А затем удалите содержимое существующей таблицы в памяти. Повторить.

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

Прежде чем пытаться сделать что-то ( неудобно перестроенное ) вроде этого, я бы также предложил попытаться заставить SQLite работать как можно быстрее . SQLite должен легко обрабатывать> 50 КБ вставок записей в секунду. Несколько записей журнала дважды в секунду не должны вызывать значительного замедления.

12
ответ дан 5 December 2019 в 08:50
поделиться

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

  • Подсчитать количество записей, вставленных на данный момент
  • Начать транзакцию
  • Вставить свою запись
  • Увеличить счетчик
  • Подтвердить / завершить транзакцию, когда было вставлено N записей
  • Повторить

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

5
ответ дан 5 December 2019 в 08:50
поделиться

Беглый поиск в документации SQLite не дал ничего полезного (это было маловероятно, и я этого не ожидал).

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

2
ответ дан 5 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: