sqlite3内存不断增加的原因
数据库是这样设计的:用内存保存数据,以提高增删查改的速度,同时把数据写入磁盘,让数据落地。
如果不删除数据库里的数据,随着数据不断地添加到数据库,数据库越来越大,RES内存也越来越大。
见测试代码a.c:
/*************************************************************************
* File: a.cpp
* Brief:
* Author:
* Created Time: Tue 05 Jan 2016 09:53:18 AM CST
************************************************************************/ #include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include"sqlite3.h" #define LOG_MSG(d,a,...) printf(a,##__VA_ARGS__) sqlite3* m_SQLite3Conn=NULL;
int m_nextserial=;
char m_sql[]; int SQLiteExcute(const char* sql)
{
if (NULL == m_SQLite3Conn || NULL == sql || strcmp(sql, "") == )
{
return -;
}
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 -;
}
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 -;
}
ret=sqlite3_threadsafe();
if (!ret)
{
LOG_MSG(err_LogLevel,"sqlite3 is not thread safe");
}
return ;
} int ainsert(char* ip,char* user,char* pwd)
{
char id[];
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[];
sprintf(id,"id-%d",m_nextserial-);
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(*);
while()
{
ainsert("192.168.1.12","user2","pwd2");
/*
---内存持续增加研究--- 原来,数据库是这样设计的:用内存保存数据,以提高增删查改的速度,同时把数据写入磁盘,让数据落地。
如果不删除数据库里的数据,随着数据不断地添加到数据库,数据库越来越大,RES内存也越来越大。 开启如下的删除数据库数据的功能代码后,虽然不断地有新数据添加到数据库,但也一直从数据库中删除着数据。
数据库的数据总量一直保持10条数据的总量,VIRT、RES、SHR长期保存不变。 所以,数据库里已经使用过的数据,应该尽量删除。
或者,每次操作数据库的数据后,要关闭数据库连接,下一次要操作数据库的数据时,再打开连接。
即重复如下逻辑:"打开数据->操作数据库数据->关闭数据库"。 当然,数据库文件也要定期缩减。因为即使你删除了数据库的数据,sqlite3也不会自动缩减数据库。
所以,需要定期执行sql缩减数据库文件命令:"vacuum;"。 */
//adelete(); //如果不注析此语句,内存会不断地增加;如果注析,内存一直保持稳定不变。
usleep();
}
return ;
}
编译运行,使用如下命令查看进程内存情况,发现内存一直稳定不变。
top -p precessID
完成测试工程见:百度网盘\软件源码\testsqlite.tar.gz
完。
sqlite3内存不断增加的原因的更多相关文章
- Java内存泄露的原因
Java内存泄露的原因 1.静态集合类像HashMap.Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector ...
- 深入研究EF Core AddDbContext 引起的内存泄露的原因
前两天逛园子,看到 @Jeffcky 发的这篇文章<EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下>. 一开始只是粗略的扫了一遍没仔细看,只是觉得是多次 ...
- Windows 系统提示“内存不足”的原因及解决方法
Windows 系统提示“内存不足”的原因及解决方法 windows XP vista 及windows 7系统的电脑有时候会出现系统提示“内存不足”,这是由多方面原因造成的.本文具体分析下 ...
- 牛客网Java刷题知识点之内存溢出和内存泄漏的概念、区别、内存泄露产生原因、内存溢出产生原因、内存泄露解决方案、内存溢出解决方案
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- 关于JVM内存溢出的原因分析及解决方案探讨
前言:JVM中除了程序计数器,其他的区域都有可能会发生内存溢出. 0.什么是内存溢出 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出. 1. ...
- 怎样解决SQL Server内存不断增加问题
原文:怎样解决SQL Server内存不断增加问题 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn. ...
- 分析CPU使用率不断增加的原因
工程中发现引起的问题: 结合别的朋友的意见,我的优化思路是: 1.排查是否内存泄漏 经过反复查询代码,未发现有内存泄漏(可以自己百度搜索C#内存泄漏的原因).可以通过任务管理器分析是否有内存泄漏,打开 ...
- 【腾讯优测干货分享】如何降低App的待机内存(三)——探索内存增长的原因
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/8BiKIt3frq9Yv9KV5FXlGw 1.3新问题的进一步挖 ...
- C/C++ char a[ ] 和 char *a 的差别,改变 char *a爆内存错误的原因
对于一些需要传入参数为 char * temp 指针类的函数: 我们定义一个 char a[10] 或char *a 传进去都是可以的. 但是, 如果该函数是会改变你所传入的参数的值时, 传入 cha ...
随机推荐
- objective-c 中随机数的用法 3种:arc4random() 、random()、CCRANDOM_0_1()
oc 中随机数的用法(arc4random() .random().CCRANDOM_0_1() 1).arc4random() 比较精确不需要生成随即种子 使用方法 : 通过arc4random() ...
- 单源最短路径——Dijkstra算法学习
每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好 ...
- js实现svg图形转存为图片下载
我们知道canvas画布可以很方便的js原生支持转为图片格式并下载,但是svg矢量图形则并没有这方面原生的支持.研究过HighChart的svg图形的图片下载机制,其实现原理大体是浏览器端收集SVG代 ...
- bootstrap ace treeview树表
html部分 <div class="widget-main padding-8" style="height:400px;overflow-y: scroll;& ...
- oracle导sql脚本
在plsql里,新建命令窗口,输入如下命令 @d:\test.sql
- Codeforce Round #225 Div2
这回的C- -,弄逆序,我以为要弄个正的和反的,没想到是等价的,弄两个还是正确的,结果我又没注意1和0只能指1个方向,结果弄了4个,取了4个的最小值就错了,自己作死没弄出来...,后面又玩去了...哎 ...
- 最大密集子图(01分数规划+二分+最小割)POJ3155
题意:给出一副连通图,求出一个子图令g=sigma(E)/sigma(V); h[g]=sigma(E)-g*sigma(V):设G是最优值 则当h[g]>0:g<G h[g]<0, ...
- How to use Ubuntu Linux in virtual box
安装git : yum install git 查询包: rpm -ql git 打开文件夹目录: nautilus 目录路径
- C++多线程调试和测试的注意事项
在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”.利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开 ...
- eclipse key
让我们按照使用频率来看看我最爱用的一些热键组合.(注:以下内容在Eclipse3.02及一上版本通过测试) . Control-Shift-T: 打开类型(Open type).如果你不是有意磨洋工, ...