1、分析:首先我认真思考了一下,程序奔溃后系统输出的错误信息out of memory:kill process(27731) sqlite score 621 or sacrifice child。重点在out of memory!!!即内存用完,内存泄露,程序为了保证安全,杀死了一个进程。
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 * from TABLE1",这条语句是:查询的是数据表TABLE1中所有的内容,随着程序运行时间,数据越来越多,那么需要查询的压力就会越大,从而导致,VSZ呈指数增长,最终导致程序崩溃。
5、解决方法:将sqlite3_get_ta水瑞侮瑜ble(db,"select * from TABL呶蓟鹭毵E1",&table,&nrow,&ncol,&errmsg);改为sqlite3_get_table(db,"select * from TABLE1 where ID=%d",row”,&table,&nrow,&ncol,&errmsg);即加上一条限制条件where ID=%d",row即可,这样每次查询就这是单单查询sqlite数据表的主键。