как мы можем обеспечить кэширование для сокращения цикла записи файловой системы для баз данных SQLite - PullRequest
1 голос
/ 18 апреля 2009

Я хотел бы реализовать кэширование в SQLite базе данных. Моя основная задача - записать данные в RAM , и когда Кэш заполнен, я хочу сбросить все данные в базу данных диска. Я хотел бы знать, возможно ли это вообще? если возможно я могу иметь некоторые примеры кодов?

Спасибо

Ответы [ 4 ]

4 голосов
/ 18 апреля 2009

SQLite уже имеет собственное кэширование, которое, вероятно, будет более эффективным, чем все, что вы можете реализовать - вы можете прочитать об интерфейсе к нему здесь . Вас могут заинтересовать другие оптимизации - здесь есть FAQ здесь .

1 голос
/ 19 апреля 2009

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

Таким образом, пакетируя несколько операторов в транзакции, вы можете получить значительное увеличение скорости, так как несколько блоков данных будут записаны до вызова fsync.

Старая статья sqlite здесь иллюстрирует эту разницу между выполнением нескольких INSERT внутри и вне транзакций.

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

С учетом сказанного также возможно, что схема кэширования sqlite справится с этим для вас.

1 голос
/ 18 апреля 2009

Возможно, вы захотите проверить команды тонкой настройки SQLite (прагмы)

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

Почему вы хотите это сделать? У вас проблемы с производительностью? Или вы хотите, чтобы другие соединения не видели данные, пока вы не зафиксируете их на диск?

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

  1. Использование транзакций. Преимущества: высокая надежность и простота. Недостатки: как только вы начнете транзакцию, никто не сможет писать в базу данных, пока вы не наберете COMMIT или ROLLBACK. Обычно это лучшее решение. Если у вас много работы за один раз, начните транзакцию, напишите все, что вам нужно, затем COMMIT. Все ваши изменения будут кэшироваться в оперативной памяти до тех пор, пока вы не COMMIT, после чего база данных будет явно синхронизироваться с диском.

  2. Используйте PRAGMA journal_mode=MEMORY и / или PRAGMA synchronous=OFF. Преимущества: высокая скорость и простота. Недостатки: база данных больше не защищена от потери питания и программных сбоев. Вы можете потерять всю базу данных с помощью этих опций . Однако они избегают явной синхронизации с диском так часто.

  3. Запишите свои изменения в базу данных в памяти и синхронизируйте их вручную, когда захотите. Преимущества: высокая скорость и надежность. Недостатки: Сложно, и другая программа может записывать в базу данных, не зная об этом. Записывая в базу данных в памяти, вам никогда не нужно синхронизировать данные с диском, пока вы не захотите. Другие программы могут записывать в файл базы данных, и если вы не будете осторожны, вы можете перезаписать эти изменения. Этот вариант, вероятно, слишком сложен, чтобы того стоить.

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