博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sqlite3内存不断增加的原因
阅读量:7154 次
发布时间:2019-06-29

本文共 3128 字,大约阅读时间需要 10 分钟。

数据库是这样设计的:用内存保存数据,以提高增删查改的速度,同时把数据写入磁盘,让数据落地。

如果不删除数据库里的数据,随着数据不断地添加到数据库,数据库越来越大,RES内存也越来越大。

 

见测试代码a.c:

/*************************************************************************    * File: a.cpp    * Brief:     * Author:     * Created Time: Tue 05 Jan 2016 09:53:18 AM CST ************************************************************************/#include
#include
#include
#include"sqlite3.h"#define LOG_MSG(d,a,...) printf(a,##__VA_ARGS__)sqlite3* m_SQLite3Conn=NULL;int m_nextserial=0;char m_sql[255];int SQLiteExcute(const char* sql){ if (NULL == m_SQLite3Conn || NULL == sql || strcmp(sql, "") == 0) { return -1; } char* err_msg = NULL; if(sqlite3_exec(m_SQLite3Conn,sql,NULL,NULL,&err_msg) != SQLITE_OK) { LOG_MSG(err_LogLevel,"sqlite3_exec fail.err=%s, sql=%s",err_msg,sql); sqlite3_free(err_msg); return -2; } int rows=sqlite3_changes(m_SQLite3Conn); sqlite3_free(err_msg); return rows;}int ainit(){ char* sql; sql="create table if not exists DeviceInfo(" "serial TEXT PRIMARY KEY, " "ip TEXT, " "user TEXT, " "pwd TEXT);"; SQLiteExcute(sql); sql="create index idxT1 on DeviceInfo(ip);"; SQLiteExcute(sql); }int aopen(){ int ret = sqlite3_open_v2("./db.db",&m_SQLite3Conn, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_FULLMUTEX, NULL); if(ret != SQLITE_OK){ LOG_MSG(err_LogLevel,"open sqlite db failure[%s]", sqlite3_errmsg(m_SQLite3Conn)); return -2; } ret=sqlite3_threadsafe(); if (!ret) { LOG_MSG(err_LogLevel,"sqlite3 is not thread safe"); } return 0;}int ainsert(char* ip,char* user,char* pwd){ char id[255]; sprintf(id,"id-%d",m_nextserial++); sprintf(m_sql, "insert into DeviceInfo(serial, ip, user, pwd) " "values('%s', '%s', '%s', '%s') ", id, ip, user, pwd); int ret=SQLiteExcute(m_sql); printf("id=%s\n",id); return ret;}int adelete(){ char id[255]; sprintf(id,"id-%d",m_nextserial-10); sprintf(m_sql, "delete from DeviceInfo where serial='%s' ", id); int ret=SQLiteExcute(m_sql); printf("delete id=%s\n",id); return ret;}int main(){ aopen(); ainit(); printf("hello pid=%d\n",getpid()); usleep(10000*900); while(1) { ainsert("192.168.1.12","user2","pwd2"); /* ---内存持续增加研究--- 原来,数据库是这样设计的:用内存保存数据,以提高增删查改的速度,同时把数据写入磁盘,让数据落地。 如果不删除数据库里的数据,随着数据不断地添加到数据库,数据库越来越大,RES内存也越来越大。 开启如下的删除数据库数据的功能代码后,虽然不断地有新数据添加到数据库,但也一直从数据库中删除着数据。 数据库的数据总量一直保持10条数据的总量,VIRT、RES、SHR长期保存不变。 所以,数据库里已经使用过的数据,应该尽量删除。 或者,每次操作数据库的数据后,要关闭数据库连接,下一次要操作数据库的数据时,再打开连接。 即重复如下逻辑:"打开数据->操作数据库数据->关闭数据库"。 当然,数据库文件也要定期缩减。因为即使你删除了数据库的数据,sqlite3也不会自动缩减数据库。 所以,需要定期执行sql缩减数据库文件命令:"vacuum;"。 */ //adelete(); //如果不注析此语句,内存会不断地增加;如果注析,内存一直保持稳定不变。 usleep(2000); } return 0;}

编译运行,使用如下命令查看进程内存情况,发现内存一直稳定不变。

top -p precessID

 

完成测试工程见:百度网盘\软件源码\testsqlite.tar.gz

 

完。

 

转载于:https://www.cnblogs.com/liyou-blog/p/5101955.html

你可能感兴趣的文章
Web Server 与 App Server
查看>>
找出包含正好5个字符的名字
查看>>
[译]Godot系列教程五 - 制作Godot编辑器插件
查看>>
WebSocket实战之————Workerman服务器的安装启动
查看>>
java-pageEncoding与contentType的区别
查看>>
线程池调优
查看>>
直接插入排序
查看>>
Java高级特性之泛型
查看>>
squirrelsql安装
查看>>
@validated 验证 List 参数在spring中
查看>>
Tire树
查看>>
how to install oracle jdk 7 on ubuntu lucid lts 10.04
查看>>
install 7z support for ubuntu
查看>>
利用kettle中的JS来完成ETL数据校验
查看>>
Python自然语言处理学习笔记(18):3.2 字符串:最底层的文本处理
查看>>
quartz和spring结合后的使用,模仿型
查看>>
关于The status code returned from the server was: 500的错误
查看>>
POJ 3225 Help with Intervals
查看>>
e-企业管理解决方案-客户管理系统
查看>>
Windows Vista/Windows 7上安装wince5.0/6.0及SDK模拟器
查看>>