我们正在尝试将SQLite集成到我们的应用程序中,并尝试将其填充为缓存。我们计划将其用作内存数据库。第一次使用它。我们的应用程序是基于C ++的。
我们的应用程序与主数据库交互以获取数据并执行大量操作。这些操作通常涉及一个相当大的表。我们在SQLite中复制了这个表,以下是观察结果:
字段数:60记录数:1,00,000
随着数据量的增加,应用程序的内存从120MB大幅增加到大约1.4 GB。此时我们的应用程序处于空闲状态,没有进行任何主要操作。但通常情况下,一旦操作开始,内存利用率就会上升。现在使用SQLite和内存数据库以及这种高内存使用情况,我们认为我们无法支持这些记录。
现在当我使用sqlite3_close()关闭数据库时,内存是否未被释放? 我甚至试图放弃桌子,但记忆仍然很高? 需要做什么才能使sqlite释放获取的内存和应用程序的内存恢复正常?
答案 0 :(得分:1)
忘记问题的sqlite部分,因为此问题适用于Linux下的任何用户进程。
进程可以通过对brk(2)
的系统调用来扩展其数据段。原则上,进程可以通过进行适当的调用来缩小数据段,从而释放该内存。实际上,这是一种创建总线错误的绝妙方法,因为很难确保指向更大数据空间的指针永远不会被解引用。
然而,虚拟内存得到了拯救。进程大小与核心驻留集大小(sz
和rss
之间存在差异,如ps -F
所示)。对于具有最近没有被访问的内存的进程,rss可以比sz小得多,并且对于一些等待发生某些事情的进程(例如,非活动getty进程),rss可以为零,这意味着整个进程地址空间已被换出,以便活动程序可以使用内存。
回到你的问题,你没有解释你为什么要使用内存数据库,但无论你运行它的方式,该表将通过带有基于磁盘的存储的sqlite显式地结束在磁盘上或通过虚拟内存系统。
答案 1 :(得分:0)
我猜这个问题已经解决了。每次执行查询后,我都没有执行sqlite3_finalize()。完成此操作后,内存大小现已大幅减少。