1

我有一个 Windows IoT 应用程序,它从某个数据源捕获数据并将其存储在持久存储中。这是我的技术栈

  1. Windows 10 物联网核心版
  2. UWP 后台应用程序 (C#)
  3. SQLite
  4. 通用 Windows 平台 3.19.3 的 SQLite
  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; }
}

为了测试,我在这个表中存储了 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

问题在于,对于仅 6 小时的数据(大约 216000 行,数据速率为 10Hz),获取记录需要大约 90 秒,这太慢了。最后,我需要将数据转换为 CSV 并提供文件下载,我尝试将文件存储为平面 csv 文件,与 SQLite 方法相比,它的速度呈指数级增长,就像上述情况一样,它只需要 5 秒一般。

我想知道我有哪些选项可以优化 SQLite 性能(如果有的话)?这是一个非常简单的查询,我怀疑是因为 SD 卡存储,我使用的是 10 类存储卡,CSV 也在同一张卡上以合理的速度工作。

在这种情况下,任何建议都会受到高度赞赏。

4

1 回答 1

0

DateTime您可以通过将此表设置为WITHOUT ROWID 表DateTime作为主键来加快搜索速度。

但是从数据库中读取和解析数十兆字节的数据并tblDataLog在内存中构建数十万个对象都需要时间。当您实际上不需要这些对象时,您不应该使用它们;使用不同类型的 API(例如 SQLitePCL.raw)读取数据会更有效。

于 2017-07-28T17:15:54.020 回答