Загрузка базы данных SQLite на диск в базу данных в памяти и синхронизация - PullRequest
1 голос
/ 27 августа 2011

У меня есть база данных SQLite, которая имеет довольно интенсивные повторные чтения и случайные записи.Однако записи (из-за индексации) имеют тенденцию блокировать чтения.Я хотел бы прочитать базу данных на диске в базу данных в памяти и затем синхронизировать ее с диском, когда машина полностью простаивает в течение 5-10 секунд.У меня был короткий соблазн скопировать таблицы из прикрепленной базы данных на диске в базу данных в памяти, но, похоже, должен быть лучший способ.Я также рассмотрел транзакции, которые фиксируются, когда машина простаивает (но это блокирует интенсивные чтения).Чтения включают таблицы, которые должны быть обновлены (или вставлены), но записи не чувствительны ко времени.

Ответы [ 2 ]

1 голос
/ 27 августа 2011

ЕСЛИ коммерческая библиотека является опцией - см. http://www.devart.com/dotconnect/sqlite/

Она поставляется (помимо прочего) с поддержкой in-memory-DB и имеет компонент SQLiteDump, который в основном позволяет выполнять то, что вы описываете... он также поставляется с поддержкой ADO.NET DataSet / DataTable, LINQ, PLINQ, EF и т. д. и поддерживает последние версии SQListe ...

1 голос
/ 27 августа 2011

Вы должны обновить до SQLite 3.7.0 или более поздней версии, которая включает запись в журнал. Этот новый метод блокировки позволяет читать во время записи.

http://www.sqlite.org/draft/wal.html

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

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

Другой вариант - использовать новую версию Oracle BerkleyDB, которая имеет внешний интерфейс SQLite, включающий ту же оболочку .NET, и заменяет официальные версии SQLite. Они изменили механизм блокировки для поддержки блокировок на уровне страниц вместо блокировок на уровне базы данных и значительно улучшили параллелизм и, следовательно, производительность нескольких соединений. Я не использовал это сам, но я читаю хорошие вещи.

http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html

...