Impose A Limit On Heap Size
对堆大小施加限制
sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N
sqlite3_soft_heap_limit64()接口设置and/or查询可由SQLite分配的堆内存量的软限制。随着堆内存使用量接近限制,SQLite通过减少页面缓存中保存的页面数量,努力将堆内存利用率保持在软堆限制以下。软堆限制是“软”,因为尽管SQLite努力保持低于限制,它将超出限制,而不会产生SQLITE_NOMEM错误。换句话说,软堆限制只是建议性的。
来自sqlite3_soft_heap_limit64()的返回值是调用之前的软堆限制的大小,或者在出现错误时为负数。如果参数N为负数,则不会更改软堆限制。因此,软堆限制的当前大小可以通过调用带有负参数的sqlite3_soft_heap_limit64()来确定。
如果参数N为零,那么软堆限制将被禁用。
如果满足以下一个或多个条件,则在当前实现中不执行软堆限制:
- 软堆限制设置为零。
- 使用sqlite3_config(SQLITE_CONFIG_MEMSTATUS,...)启动时选项和SQLITE_DEFAULT_MEMSTATUS编译时选项的组合禁用内存记帐。
- 使用sqlite3_config(SQLITE_CONFIG_PCACHE2,...)指定备用页面缓存实现。
- 页面缓存从sqlite3_config提供的自己的内存池(SQLITE_CONFIG_PAGECACHE,...)分配而不是从堆中分配。
从SQLite 版本3.7.3(2010-10-08)开始,无论是否调用SQLITE_ENABLE_MEMORY_MANAGEMENT编译时选项,都会强制实施软堆限制。使用SQLITE_ENABLE_MEMORY_MANAGEMENT,软堆限制将在每个内存分配上执行。如果没有SQLITE_ENABLE_MEMORY_MANAGEMENT,只有当内存由页面缓存分配时才会执行软堆限制。测试表明,因为页面缓存是SQLite中占主导地位的内存用户,所以大多数应用程序将在不使用SQLITE_ENABLE_MEMORY_MANAGEMENT的情况下实现足够的软堆限制。
在未来的SQLite版本中,SQLite强制执行软堆限制的情况可能会发生变化。