养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

使用SQLite3数据库存储数据导致系统资源占满

时间:2024-10-19 23:35:21

飞凌嵌入式开发板上搭建sqlite3数据库,在运行应用程序调用数据库进行数据存储的时候,发现程序运行一段时间,就会崩掉,并输出outofmemory:killprocess(27731)sqlitescore621orsacrificechild。再次运次程序,打开Linux的TOP资源监测,观察到VSZ的数值一直增大,增大到一个固定值程序就会崩掉。通过反复试验,终于找到了问题,分析和解决方法如下:

方法/步骤

1、分析:首先我认真思考了一下,程序奔溃后系统输出的错误信息outofmemory:killprocess(27731)sqlitescore621orsacrificechild。重点在outofmemory!!!即内存用完,内存泄露,程序为了保证安全,杀死了一个进程。

2、其次,再次打开Linux的TOP系统资源监控,观察VSZ的变化规律,发现VSZ的数据一直在增大,且呈指数型增大,非线性的。当VSZ数值到221M,程序就会崩掉。

3、发现VSZ的数据一直在增大,且呈指数型增大。分析得到:每次sqlite输入一条数据前,都会进行一次查询数据表操作,随着数据条数越来越多,每次查询就会浪费越多的系统资源,这就造成了系统资源占用越来越多。查找相关知识,Linux默认会给每个进程分配221M虚拟内存,因此当当VSZ数值到221M,程序就会崩掉。

4、当时,sqlite程序查询语句是:sql坡纠课柩ite3_get_table(db,"select*from皈其拄攥TABLE1",&table,&nrow,&ncol,&errmsg);问题就出在了"select*fromTABLE1",这条语句是:查询的是数据表TABLE1中所有的内容,随着程序运行时间,数据越来越多,那么需要查询的压力就会越大,从而导致,VSZ呈指数增长,最终导致程序崩溃。

5、解决方法:将sqlite3_get_ta水瑞侮瑜ble(db,"select*fromTABL呶蓟鹭毵E1",&table,&nrow,&ncol,&errmsg);改为sqlite3_get_table(db,"select*fromTABLE1whereID=%d",row”,&table,&nrow,&ncol,&errmsg);即加上一条限制条件whereID=%d",row即可,这样每次查询就这是单单查询sqlite数据表的主键。

© 一点知识