【问题标题】:Application crash when selecting many rows of a SQLite table选择 SQLite 表的多行时应用程序崩溃
【发布时间】:2013-11-12 13:38:24
【问题描述】:

我的 SQLite 数据库有问题。

我有一个包含 600 万行的表。

当我执行Select * from that_table 时,我可以在 Widows 任务管理器中看到内存使用量大幅增加。 这使我的应用程序崩溃。

我在 Firefox 中有一个用于 SQLite 的管理工具插件。当我执行相同的查询时,此工具也会崩溃。

有没有办法选择这么多行而不会崩溃?

我猜 600 万行不算多 - SQLite 不应该能够处理吗?

应用程序是用 C# 编写的。数据来自传感器并存储在ChartObject 类型的列表中。 ChartObject 是一个有 6 个属性的结构体:

public struct ChartObject
{
    public ISensor Sensor { get; set; }

    public DateTime Category { get; set; }

    public double ValueX { get; set; }

    public double? ValueY { get; set; }

    public double? ValueY2 { get; set; }

    public string Tooltip { get; set; }
}

此列表包含多达 200 万个 ChartObject。 ChartObject 用于包含 1 个测量点、x 值、y 值、校准的 y 值(ValueY2)和测量该点的传感器。

我使用这个列表在图表上绘制数据。

【问题讨论】:

  • 取决于每行的大小以及您对选择结果的处理方式。您是否需要同时将它们全部存储在内存中,还是可以遍历行?
  • 我需要它们同时在内存中。
  • 不,对不起,我使用限制为 2.000.000 的循环缓冲区。所以我从不在内存中存储超过 200 万行数据。
  • 这仍然可能是大量内存,具体取决于行的大小。你确定你需要它们在内存中吗?无论您对它们进行什么处理,您可以将其中的一部分放在select 中,以便 sqlite 为您完成一些工作并返回一个较小的结果集吗?
  • 所以我会在几个选择语句中选择数据块?

标签: sql sqlite memory crash


【解决方案1】:

问题不在于 sqlite,而在于您使用结果集的方式。如果您需要从表中的每一行创建一个新的ChartObject,请像这样遍历它们:

foreach (var myrow in (from x in that_table select x))
{
    var myChartObject = new ChartObject();
    // populate myChartObject fields from myrow
    // add myChartObject to the actual chart
}

如果您在 Linq 查询中错误地调用 ToList(),您将不必要地将所有这些行加载到内存中。如果您不需要同时在内存中的行,您可以避免这种情况。请记住,200 万个ChartObjects 本身将需要大量内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多