sqlite sqlite3_close()不释放获取的内存

时间:2010-11-16 04:31:33

标签: sqlite memory memory-management memory-leaks

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

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

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

随着数据量的增加,应用程序的内存从120MB大幅增加到大约1.4 GB。此时我们的应用程序处于空闲状态,没有进行任何主要操作。但通常情况下,一旦操作开始,内存利用率就会上升。现在使用SQLite和内存数据库以及这种高内存使用情况,我们认为我们无法支持这些记录。

现在当我使用sqlite3_close()关闭数据库时,内存是否未被释放? 我甚至试图放弃桌子,但记忆仍然很高? 需要做什么才能使sqlite释放获取的内存和应用程序的内存恢复正常?

2 个答案:

答案 0 :(得分:1)

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

进程可以通过对brk(2)的系统调用来扩展其数据段。原则上,进程可以通过进行适当的调用来缩小数据段,从而释放该内存。实际上,这是一种创建总线错误的绝妙方法,因为很难确保指向更大数据空间的指针永远不会被解引用。

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

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

答案 1 :(得分:0)

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