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 ...
随机推荐
- LED_9261在linux2.6.30中tick_led的实现
在linux2.6.30内核中,内核也提供了相关的平台驱动来操作gpio或LED,但更简便的方法是直接操作GPIO来控制led. 网上一博文中介绍直接封装led_on和led_off()函数直接调用即 ...
- The L1 Median (Weber 1909)
The L1 Median (Weber 1909) 链接网址 Derived from a transportation cost minimization problem, the L1 medi ...
- ios添加方法快捷方式
- iOS UICollectionView之三(基本用法)
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...
- SQL注入攻击之关键字检测
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来.我们都知道计算机技术发展日新月异,速度惊人的快,你我稍不留神,就会被慢慢淘汰!因此:每日不间断的学习是避免被 ...
- Unity3D 通用提示窗口实现分析(Inventory Pro学习总结)
背景 游戏中的UI系统或者叫做GUI窗口系统主要有:主要装备窗口(背包,角色窗口也是一种特殊窗口).确实提示窗口(如购买确认).信息提示窗口(一遍没有按钮,ContexntMenu)和特殊窗口(聊天记 ...
- 通过xib加载textfield的时候 发生 this class is not key value coding-compliant for the key textField. 情况怎么解决
连线的时候不要选files’owner 要选xib自己的class
- ads 错误
这个问题已经不是第一次碰到了,每次弄周立功的EasyARM2210的时候都会遇见,每次都没有记住.就是要用ADS运行板子配套光盘里面的配套程序的时候会出现: (Fatal)L6002U:Could n ...
- Python学习总结14:时间模块datetime & time & calendar (一)
Python中的常用于处理时间主要有3个模块datetime模块.time模块和calendar模块. 一.time模块 1. 在Python中表示时间的方式 1)时间戳(timestamp):通常来 ...
- SQL查询 练习题
设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表 ...