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

sqlite sqlite3_close()不会释放获取的内存,sqlite,memory,memory-management,memory-leaks,Sqlite,Memory,Memory Management,Memory Leaks,我们正在尝试将SQLite集成到我们的应用程序中,并尝试将其填充为缓存。我们计划将其用作内存中的数据库。第一次使用它。我们的应用程序是基于C++的. 我们的应用程序与主数据库交互以获取数据并执行大量操作。这些操作通常涉及一个非常大的表。我们在SQLite中复制了该表,观察结果如下: 字段数:60记录数:100000 随着数据填充的开始,应用程序的内存从120MB急剧增加到~1.4GB。此时,我们的应用程序处于空闲状态,没有执行任何主要操作。但通常,一旦操作开始,内存利用率就会上升。现在有了SQL

我们正在尝试将SQLite集成到我们的应用程序中,并尝试将其填充为缓存。我们计划将其用作内存中的数据库。第一次使用它。我们的应用程序是基于C++的.</P> 我们的应用程序与主数据库交互以获取数据并执行大量操作。这些操作通常涉及一个非常大的表。我们在SQLite中复制了该表,观察结果如下:

字段数:60记录数:100000

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

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

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

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

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


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

我想问题已经解决了。每次执行查询后,我都没有执行sqlite3_finalize()。一旦这样做了,内存大小现在已经大大减少。

我们需要SQLite来加速应用程序中的一些进程。安装程序基于Windows,SQLite数据库完全基于内存。即使表确实在磁盘上结束,那么在调用close()时,占用的内存也应该恢复正常。不是吗?