SQLite3 -内存使用逐渐增加,直到所有可用内存被消耗
SQLite3 - memory usage gradually increases until all available memory are consumed
我在长时间运行一个简单的单线程c++程序(比如一晚上)时遇到了内存使用问题。该程序使用SQLite3 API打开数据库,并在循环中向其中写入一些数据。我在两台不同的机器上运行这个程序:一台是桌面版Ubuntu Linux,另一台是基于ARM的嵌入式设备,运行定制版Linux。在这两种情况下,我都得到了相同的结果:内存是逐渐消耗的,在应用程序运行时不释放。我正在检查内存使用使用一个简单的bash脚本运行在后台:
while true;
do free -m;
sleep 2;
done
应该注意的是,我还使用SQLite提供的API监控内存使用情况:
sqlite3_memory_used()
API报告相当稳定的内存使用量,但"free -m"报告不同,并逐渐增加。
SQLite源代码是用以下标志编译的:
SQLITE_DEFAULT_TEMP_CACHE_SIZE=3
SQLITE_DEFAULT_WAL_AUTOCHECKPOINT=2
SQLITE_MAX_MMAP_SIZE=2048
SQLITE_ENABLE_MEMSYS5
SQLITE_ENABLE_MEMORY_MANAGEMENT
SQLITE_DEFAULT_CACHE_SIZE=3
SQLITE_DEFAULT_AUTOVACUUM=1
SQLITE_DEFAULT_PAGE_SIZE=512
请注意,在这个阶段,我不关心速度,但我主要关心的是内存使用,所以我设置参数的方式是,在内存中缓存的数据最少,并尽快将它们推送到磁盘。
我还在每次迭代中使用"PRAGMA shrink_memory"。
为了最小化动态内存分配,我还为以下内存类型提供了静态数组:
SQLITE_CONFIG_HEAP
SQLITE_CONFIG_SCRATCH
SQLITE_CONFIG_PAGECACHE
写入数据库的代码片段如下:
char SQL_Statement[100]={0};
char *ErrMsg = 0;
for (int i = 0; i < 1000000; i++)
{
sprintf(SQL_Statement, "INSERT INTO PointValue (TimeStamp, BlockId, PointId, Value) VALUES (%f, %d, %d, %d);",TimeStamp_ ,BlockId_, PointId_, Value_ );
check = sqlite3_exec(MyDB, SQL_Statement, callback, (void*)data, &ErrMsg);
sqlite3_free(ErrMsg);
}
感谢大家的回答和评论。可以确定的是,内存是由linux页面缓存消耗的,这很好,因为linux希望能够照顾它,并在另一个应用程序需要更多内存时释放不必要的页面。只需使用一个简单的命令:
cat /proc/meminfo
sqlite3_exec的最后一个参数只在发生错误时设置,在这种情况下初始化调用sqlite3_malloc,需要被释放,但是当没有发生错误时设置为NULL,调用sqlite3_free可能是一个问题,带有NULL变量。尝试添加一个条件:
if (ErrMsg != nullptr) // if C++11 or NULL o 0 if C++98
sqlite3_free(ErrMsg);
查看url: http://www.sqlite.org/c3ref/exec.html
正如Sqlite3文档所述,传递给回调的内存不需要任何自由调用,在sqlite3_exec内部调用sqlite3_step() witch之后,所有的内存都将自动释放并且无效,因此,如果您需要在回调中保存该值以供以后使用,则需要对其进行复制,指针将在下一次回调调用或之后执行的代码中失效。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 使用 sqlite3 时内存不足
- sqlite3数据库加载到内存c++并选择perfomance
- 将 sqlite3 与 C++ 一起使用时出现内存泄漏
- SQLite3 -内存使用逐渐增加,直到所有可用内存被消耗