Задать вопрос

Как максимально быстро многопоточно читать из SQLite read-only базы в памяти?

Добрый день, При использовании Microsoft.Data.Sqlite с "Data Source=filename;Mode=Memory;Cache=Shared" можно создавать подключения к единой базе, НО из-за Cache=Shared производительность ниже чем read-only подключения к базе из файла. Пробовал PRAGMA read_uncommited = true, но не помогло.

База используется для замены LINQ->WHERE->ORDER BY... -> SKIP-> TAKE для ~1 млн объектов с ~20 полей из которых 10 string'и.

Как максимально быстро многопоточно (500 - 5000 параллельных SELECT'ов) читать из SQLite read-only базы?
Может есть какой-то кросс-платформенный VFS, который позволяет делать такое?!
  • Вопрос задан
  • 243 просмотра
Подписаться 3 Простой Комментировать
Решения вопроса 1
@Degot Автор вопроса
Необходимо использовать VFS MemDB: "Data Source=file:/inmem-filename.db?vfs=memdb"
Пример:
var memortFile = $"file:/{Path.GetFileName(databaseFilename)}";
var memoryConnectionString = $"Data Source={memortFile}?vfs=memdb";
var memoryReadOnlyConnectionString = $"{memoryConnectionString};Mode=ReadOnly";
var fileBasedConnectionString = new SqliteConnectionStringBuilder()
{
    DataSource = databaseFilename,
    Mode = SqliteOpenMode.ReadOnly,
    Pooling = true,
}.ConnectionString;

using (var inmemoryConnection = new SqliteConnection(memoryConnectionString))
{
    inmemoryConnection.Open();

    //Восстановить backup или SQLitePCL.raw.sqlite3_deserialize()
    using (var connection = new SqliteConnection(fileBasedConnectionString))
    {
        connection.Open();
        connection.BackupDatabase(inmemoryConnection);
    }

    StartConcurrentTest("IN MEM", threadsQuantities, memoryReadOnlyConnectionString);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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