【问题标题】:SQLite Abnormal Memory UsageSQLite 内存使用异常
【发布时间】:2013-05-29 02:39:49
【问题描述】:

我们正在尝试将 SQLite 集成到我们的应用程序中,并尝试填充为缓存。我们计划将其用作内存数据库。第一次使用它。我们的应用程序是基于 C++ 的。

我们的应用程序与主数据库交互以获取数据并执行大量操作。这些操作通常与一个非常大的表有关。 我们在 SQLite 中复制了这个表,以下是观察结果:

字段数:60 记录数:1,00,000

随着数据填充的开始,应用程序的内存从 120MB 急剧上升到约 1.4GB。此时我们的应用程序处于空闲状态,没有进行任何重大操作。但通常,一旦操作开始,内存利用率就会上升。现在有了内存数据库中的 SQLite 和如此高的内存使用率,我们认为我们将无法支持这么多记录。

问。有没有办法在内存中找到数据库的大小?

当我在磁盘上创建数据库时,数据库大小总和约为 40MB。但是应用程序的内存使用率仍然很高。 问。这种高使用率是否有原因。所有缓冲区都已清除,如前所述 DB 不在内存中?

任何帮助将不胜感激。

感谢和问候 萨钦

【问题讨论】:

    标签: sqlite memory memory-management


    【解决方案1】:

    想到几个问题...

    每条记录的大小是多少?

    您的平台有内存泄漏检测工具吗?

    我在一些资源受限的环境中使用 SQLite,其方式类似于您使用它的方式,并且在修复错误后,它体积小、稳定且快速。 IIRC 不清楚何时清理 SQLite API 使用的某些东西,当我们使用工具查找内存泄漏时,很容易看出问题出在哪里。

    【讨论】:

    • 应该是1K。我也会让 Purify 也运行。
    • 但这里的重点是,由于数据库不在内存中而是在磁盘上,所以内存应该非常低。不应该是这样吗。如果内存使用率这么高,那么最好创建一个内存数据库?
    • 嗨,奇怪的行为。我没有得到内存泄漏编。但我尝试了一件事。一旦内存增加,我尝试关闭数据库。内存只有轻微的下降。我什至放下表然后关闭数据库,但内存仍然很高。如何让 sqlite 释放获取的内存?
    • @chingupt 一年后我遇到了和你一样的问题。似乎 SQLite 一旦完成它就不会释放内存。例如,我创建了一个巨大的表,我在该表上执行了一个选择,然后将其放入内存中。它永远不会清理干净。即使删除表后,内存使用量也不会减少。
    【解决方案2】:

    看这个:

    PRAGMA shrink_memory

    这个 pragma 通过调用 sqlite3_db_release_memory() 使调用它的数据库连接尽可能多地释放内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多