我有一个Windows物联网应用程序,它从某个数据源捕获数据并将其存储在持久存储中。这是我的技术堆栈
- 视窗 10 物联网核心版
- UWP 后台应用程序 (C#(
- SQLite
- SQLite for Universal Windows Platform 3.19.3
- SQLite.NET-PCL NuGet https://github.com/oysteinkrog/SQLite.Net-PCL
我正在使用树莓派 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; }
}
为了进行测试,我在此表中存储了 200 万行,并且没有执行插入。以下是我获取过去 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 行,数据速率为 10Hz(,获取记录大约需要 90 秒,这太慢了。最后,我需要将数据转换为CSV并提供文件下载,我尝试将文件存储为平面csv文件,与SQLite方法相比,该文件的速度呈指数级增长,就像上述情况一样,平均只需要5秒。
我想知道我有什么选项来优化SQLite性能(如果有的话(?这是非常简单的查询,我怀疑这是由于SD卡存储,我使用的是10类存储卡,并且CSV也以合理的速度在同一张卡上工作。
在这方面,任何建议都受到高度赞赏。
您可以通过将此表设置为以DateTime
作为主键的 WITHOUT ROWID 表来加快DateTime
搜索速度。
但是,从数据库中读取和解析数十兆字节的数据并在内存中构造数十万个tblDataLog
对象将需要时间。 当您实际上不需要这些对象时,不应使用这些对象;使用不同类型的API(例如SQLitePCL.raw(读取数据会更有效。