Windows IoT上的SQLite性能调整
问题描述:
我有一个windows IoT应用程序,它从一些数据源捕获数据并将其存储在持久存储上。这里是我的技术堆栈Windows IoT上的SQLite性能调整
- 的Windows 10物联网核心
- UWP后台应用程序(C#)
- SQLite的
- SQLite,让通用Windows平台3.19.3
- 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; }
}
对于测试,我在此表中存储了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并提供文件下载,我试图将文件存储为与SQLite方法相比指数级快速的平面csv文件,就像上述情况一样,它只需要5秒钟一般。
我想知道我有什么选择来优化SQLite的性能(如果有的话)?这是非常简单的查询,我怀疑它是由于SD卡存储,我使用的是10级存储卡,并且CSV也以合理的速度在同一张卡上工作。
任何建议在这方面高度赞赏。
答
通过将此表设为WITHOUT ROWID table并以DateTime
作为主键,您可以加快DateTime
搜索的速度。
但是,从数据库中读取和解析几十兆字节的数据并在内存中构建数十万个对象需要时间。 当你不需要它们时,你不应该使用这些对象;用不同类型的API(例如,SQLitePCL.raw)读取数据会更有效率。