【问题标题】:sqlite sqlite3_close() does not release the memory acquiredsqlite sqlite3_close() 不会释放获取的内存
【发布时间】:2010-11-16 04:31:33
【问题描述】:

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

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

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

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

现在当我使用 sqlite3_close() 关闭数据库时,内存没有释放? 我什至尝试放下桌子,但内存仍然很高? 需要怎么做才能让sqlite释放获取的内存,让应用程序的内存恢复正常?

【问题讨论】:

    标签: sqlite memory memory-management memory-leaks


    【解决方案1】:

    忘记你问题的 sqlite 部分,因为这个问题适用于 Linux 下的任何用户进程。

    进程可以通过对brk(2) 的系统调用来增长其数据段。原则上,一个进程稍后可以通过适当的调用来缩小数据段来释放该内存。在实践中,这是创建总线错误的绝妙方法,因为很难确保指向更大数据空间的指针永远不会被取消引用。

    然而虚拟内存来拯救。进程的大小和内核驻留集大小之间存在差异(szrss 分别如 ps -F 所示)。对于最近没有被访问的内存的进程,rss 可以比 sz 小得多,而对于一些只是在等待某些事情发生的进程(例如非活动的 getty 进程),rss 可以为零,这意味着整个进程地址空间已被换出,以便活动程序可以使用内存。

    回到您的问题,您没有解释为什么要使用内存数据库,但是无论您以哪种方式运行它,该表都会通过带有基于磁盘的存储的 sqlite 显式地在磁盘上结束,或者通过虚拟内存系统。

    【讨论】:

    • 我们需要 SQLite 来加速我们应用程序中的一些进程。该设置基于 Windows,SQLite 数据库完全基于内存。
    • 即使表确实在磁盘上结束了,那么当调用 close() 时,占用的内存应该恢复正常。不应该吗?
    【解决方案2】:

    我想问题已经解决了。每次查询执行后,我都没有执行 sqlite3_finalize()。完成此操作后,内存大小现在已大大减少。

    【讨论】:

      猜你喜欢
      • 2016-11-05
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 2016-10-01
      • 2011-04-18
      相关资源
      最近更新 更多