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 ...
随机推荐
- 关于C、OC、C++、OC++、Swift的一些常识
关于C.OC.C++.OC++.Swift的一些常识 OC是C语言的一个超集,是一门面向对象的语言,因为苹果的崛起而火,API主要是cocoa(OSX)和cocoatouch(iOS),GCC 和 C ...
- SLAM学习笔记(3)相关概念
SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述子.这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部 ...
- [ArcEngine]IFeatureBuffer使用
public static void LoadOnlyModeInsert(IFeatureClass featureClass, List < IGeometry > geometryL ...
- django 分页(2) 使用类 页码显示
django 分页显示页码 views.py 显示11页码 ) < 起始位置 - 10总页数 else 总页数 > IF 当前页 小于 起始位置 结束页 IF 当前页 大于 IF 如果结束 ...
- 使用Fiddler对android应用抓包
工作原理 先上个图 此图一目了然,可以看出fiddler在请求中所处的位置,我们就可以确定它能干些什么. 它实际工作在本机的8888端口http代理,我们启动fiddler时,它会自动更改代理设置: ...
- 使用 jQuery Deferred 和 Promise 创建响应式应用程序
这篇文章,我们一起探索一下 JavaScript 中的 Deferred 和 Promise 的概念,它们是 JavaScript 工具包(如Dojo和MochiKit)中非常重要的一个功能,最近也首 ...
- MyEclipse6.5注册码(转)
新装的MyEclipse6.5在网上找了半天的注册码,都不可用.将下面的代码放在MyEclipse下运行后,可以得到注册码.这相当于一个注册机.我得到的如下: administrator nLR8ZC ...
- java提高篇(九)-----详解匿名内部类
在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始 ...
- java collections读书笔记(9)collection框架总览(2)
框架算法: 1)collection接口 add() Adds an element to the collection.addAll() Adds a collection of element ...
- 汉字转【pinyin】
引言 github地址:aizuyan/pinyin 无意中看到了overtrue/pinyin这个项目,感觉很有意思,这个项目做了这么一件事情: 将汉字转化为拼音 刚看到这里是不是觉得没什么难度,没 ...