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 ...
随机推荐
- Array.prototype.slice && Array.prototype.splice 用法阐述
目的 对于这两个数组操作接口,由于不理解, 往往被误用, 或者不知道如何使用.本文尝试给出容易理解的阐述. 数组 什么是数组? 数组是一个基本的数据结构, 是一个在内存中依照线性方式组织元素的方式, ...
- RequireJS初探
什么是RequireJS? /* --- RequireJS 是一个JavaScript模块加载器.它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就像 Rhino ...
- Java基础之线程——管理线程同步代码块(BankOperation4)
控制台程序. 除了同步类对象的方法之外,还可以把程序中的语句或代码块制定为synchronized,这种方式更强大,因为可以指定哪个对象从语句或代码块的同步中获益,而不像同步方法那样仅仅是包含代码的对 ...
- Java基础之写文件——创建通道并且写文件(TryChannel)
控制台程序,创建一个文件并且使用通道将一些文本写入到这个文件中. import static java.nio.file.StandardOpenOption.*; import java.nio.c ...
- 转:Python 的 Socket 编程教程
这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...
- poj 题目分类(1)
poj 题目分类 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K--0.50K:中短代码:0.51K--1.00K:中等代码量:1.01K--2.00K:长代码:2.01 ...
- Java基础(51):Super与this的区别
1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base" ...
- C++之路进阶——codevs1285(宠物收养所)
1285 宠物收养所 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服 ...
- 动画--过渡延迟时间 transition-delay
transition-delay属性和transition-duration属性极其类似,不同的是transition-duration是用来设置过渡动画的持续时间,而transition-delay ...
- mysql 行锁
在电子商务里,经常会出现库存数量少,购买的人又特别多,大并发情况下如何确保商品数量不会被多次购买. 其实很简单,利用事务+for update就可以解决. 我们都知道for update实际上是共享锁 ...