1

Ich habe eine Windows IoT-Anwendung, die Daten von einigen Datenquellen erfasst und auf persistenten Speicher speichert. Hier ist mein Technologie-StackSQLite Leistungsoptimierung auf Windows IoT

  1. Windows-10 IoT Kern
  2. UWP Hintergrund Anwendung (C#)
  3. SQLite
  4. SQLite für Universal Windows-Plattform 3.19.3
  5. SQLite.NET-PCL NuGet https://github.com/oysteinkrog/SQLite.Net-PCL

und ich benutze Raspberry Pi 3 zum Testen dieser Lösung. Zum Speichern der Daten habe ich mich für SQLite entschieden. Im Anschluss wird das Schema der Tabelle

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; } 
} 

Zum Testen habe ich gespeichert 2 Millionen Zeilen in dieser Tabelle und es gibt keine Einfügung durchgeführt wird. Im Anschluss ist mein Code, um die Daten für die letzten 6 Stunden

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 

Das Problem ist, zu holen, dass für nur sechs Stunden von Daten (etwa 216.000 Zeilen, Datenrate 10 Hz) es etwa 90 Sekunden unter Aufzeichnungen zu holen, das ist zu langsam. Am Ende muss ich die Daten in CSV konvertieren und eine Datei herunterladen, habe ich versucht, die Datei als eine flache CSV-Datei zu speichern, die im Vergleich zu SQLite exponentiell schnell ist, wie für den obigen Fall dauert es nur 5 Sekunden im Durchschnitt.

Ich möchte wissen, welche Optionen habe ich, um die SQLite-Leistung (falls vorhanden) zu optimieren? Es ist eine sehr einfache Abfrage, ich bezweifle, dass es wegen SD-Karte Speicher ist, verwende ich Klasse 10 Speicherkarte, und CSV arbeitet auch auf der gleichen Karte mit angemessener Geschwindigkeit.

Jeder Vorschlag wird in diesem Zusammenhang sehr geschätzt.

Antwort

0

Sie könnten die DateTime Suche ein wenig beschleunigen, indem Sie diese Tabelle eine WITHOUT ROWID table mit DateTime als Primärschlüssel machen.

Aber das Lesen und Parsen von mehreren zehn Megabytes an Daten aus der Datenbank und das Konstruieren von Hunderttausenden von tblDataLog Objekten im Speicher brauchen Zeit. Sie sollten diese Objekte nicht verwenden, wenn Sie sie nicht wirklich benötigen. Lesen der Daten mit einer anderen Art von API (z. B. SQLitePCL.raw) wäre effizienter.