Настройка производительности SQLite в Windows IoT

У меня есть приложение Windows IoT, которое собирает данные из некоторого источника данных и сохраняет их в постоянном хранилище. Вот мой стек технологий

  1. Базовая версия Windows 10 Интернета вещей
  2. Фоновое приложение UWP (C#)
  3. SQLite
  4. SQLite для универсальной платформы Windows 3.19.3
  5. SQLite.NET-PCL NuGet https://github.com/oysteinkrog/SQLite.Net-PCL< /а>

и я использую Raspberry Pi 3 для тестирования этого решения. Для хранения данных я решил использовать SQLite. Ниже приведена схема таблицы

public class tblDataLog
{
    [PrimaryKey]
    [AutoIncrement]
    public int RecordId { get; set; }

    public int? Param1 { get; set; }

    public int? Param2 { get; set; }

    public double? Param2 { get; set; }

    public double? Param4 { get; set; }

    public double? Param5 { get; set; }

    public int? Param6 { get; set; }

    public int? Param7 { get; set; }

    public double? Param7 { get; set; }

    public double? Param8 { get; set; }
    public double? Param9 { get; set; }
    public double? Param10 { get; set; }
    public double? Param11 { get; set; }

    [Indexed]
    public DateTime RecordedOn { get; set; }
}

Для тестирования я сохранил 2 миллиона строк в этой таблице, и вставка не выполняется. Ниже приведен мой код для получения данных за последние 6 часов.

var commandstr = $"select * from tblDataLog Where RecordedOn >= " + DateTime.Now.AddHours(-6) + " AND RecordedOn <= " + DateTime.Now;
var cmd = Connection.CreateCommand(commandstr);
var sensorDataQuery = cmd.ExecuteQuery<tblDataLog>(); //This line takes around 90 seconds on average to complete

Проблема в том, что всего за шесть часов данных (примерно 216000 строк, скорость передачи данных 10 Гц) получение записей занимает около 90 секунд, что слишком медленно. В конце мне нужно преобразовать данные в CSV и предоставить загрузку файла, я попытался сохранить файл в виде плоского файла csv, который экспоненциально быстр по сравнению с подходом SQLite, как в приведенном выше случае, это занимает всего 5 секунд в среднем.

Я хочу знать, какие варианты у меня есть для оптимизации производительности SQLite (если есть)? Это очень простой запрос, я сомневаюсь, что это связано с хранилищем на SD-карте, я использую карту памяти класса 10, и CSV также работает на той же карте с разумной скоростью.

Любое предложение высоко ценится в этом контексте.


person Muhammad Ummar    schedule 28.07.2017    source источник


Ответы (1)


Вы можете немного ускорить DateTime поиск, сделав эту таблицу БЕЗ ROWID-таблицы с DateTime как первичный ключ.

Но чтение и разбор десятков мегабайт данных из базы данных и построение сотен тысяч tblDataLog объектов в памяти потребует времени. Вы не должны использовать эти объекты, когда они вам на самом деле не нужны; чтение данных с помощью API другого типа (например, SQLitePCL.raw) было бы более эффективным.

person CL.    schedule 28.07.2017