使用sqlite内存不足的问题

ss88009 2011-06-17 10:55:54
我用sqlite3_exec执行插入语句,插入超过200次,就会有KERN-EXEC 3的错误,查看日志,应该是内存不足。下面是sqlite错误提示:

“database disk image is malformed”
"揶揶揶揶揶揶揶揶揶揶揶揶揶揶"
"out of memory"

在执行完sqlite3_exec后,怎么释放内存?
我每插完100次,就close掉,然后再打开,还是会有内存不足的错误,那位大牛有解决的办法?
...全文
1293 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ss88009 2011-09-02
  • 打赏
  • 举报
回复
一直还没有结贴。重新建了数据库,然后就ok了,汗!
ss88009 2011-06-22
  • 打赏
  • 举报
回复
出现disk I/O error错误,是因为我打开后,sqlite3_exec( iDb, "PRAGMA synchronous = on", NULL, NULL, &ptr );应该为PRAGMA synchronous = off.

不过还是有以前的问题,插入到653条时出错,

[2011-06-22 04:20:56] 653
[2011-06-22 04:20:56] disk I/O error
[2011-06-22 04:20:56] 654
[2011-06-22 04:20:56] database disk image is malformed
[2011-06-22 04:20:56] 655
[2011-06-22 04:20:56] database disk image is malformed
[2011-06-22 04:20:56] 656
[2011-06-22 04:20:56] database disk image is malformed
...
[2011-06-22 04:20:56] 698
[2011-06-22 04:20:56] disk I/O error
[2011-06-22 04:20:56] 699
[2011-06-22 04:20:56] database disk image is malformed
[2011-06-22 04:20:56] 700
[2011-06-22 04:20:56] database disk image is malformed
...
[2011-06-22 04:20:56] 1008
[2011-06-22 04:20:56] out of memory
[2011-06-22 04:20:56] 1009
[2011-06-22 04:20:56] out of memory
[2011-06-22 04:20:56] 1010
[2011-06-22 04:20:56] out of memory
[2011-06-22 04:20:56] 1011
[2011-06-22 04:20:56] out of memory
[2011-06-22 04:20:56] 1012
[2011-06-22 04:20:56] out of memory
[2011-06-22 04:20:56] 1013
然后就是KERN-EXEC 3的错我。会不会是这样,在执行插入操作时,sqlite会开辟一些内存,但是它没有释放,插入600多条时,就会导致数据库因为内存不足而损坏,到out of memory时,已经接近或达到了程序被允许使用的内存最大值,所以使得sqlite没有办法再开辟内存,但是仍使用了那个指向没有成功开辟内存的指针(空指针),这样就导致 KERN-EXEC 3。
ss88009 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 arthersophy 的回复:]

哦。这么多代码。。现在还有问题吗?
[/Quote]
还没有解决,修复了一下数据库,又有新问题:delete的时候出现disk I/O error错误。那个ptr好像是不可以删除的,我debug到那里,删除后就报USER 42问题。
漁_夫 2011-06-22
  • 打赏
  • 举报
回复
哦。这么多代码。。现在还有问题吗?
漁_夫 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ss88009 的回复:]

出现disk I/O error错误,是因为我打开后,sqlite3_exec( iDb, "PRAGMA synchronous = on", NULL, NULL, &ptr );应该为PRAGMA synchronous = off.

不过还是有以前的问题,插入到653条时出错,

[2011-06-22 04:20:56] 653
[2011-06-22 04:20:……
[/Quote]
不确定。但是我觉得几百条数据。应该没问题
漁_夫 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ss88009 的回复:]

引用 5 楼 arthersophy 的回复:

哦。这么多代码。。现在还有问题吗?

还没有解决,修复了一下数据库,又有新问题:delete的时候出现disk I/O error错误。那个ptr好像是不可以删除的,我debug到那里,删除后就报USER 42问题。
[/Quote]
必须是可以删除得。人家接口是二级指针。。

ss88009 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 arthersophy 的回复:]
首先,你对失败得操作不对。针对失败得操作,sqlite会把错误信息放在ptr里面得。也就是这个时候你需要手动释放ptr. 然后那个 KERN-EXEC 3,我估计是你得代码逻辑不严谨。 内存不足得情况下,你new一些对象实例就会失败,但是你在使用之前没有判空。所以导致 KERN-EXEC 3

void CDbOperator::Insert(const char* aSqlString)
……
[/Quote]
谢谢胡兄的回复!下面是我调用void CDbOperator::Insert(const char* aSqlString)的代码:

for(TInt i = 0; i < arrayCount; i ++)
{
char sqlBuf[256];
memset(sqlBuf,'\0',256);

TBuf<8> tempBuf;
tempBuf.AppendNum(i);
TRACE(tempBuf);

// if(array[i]->update_type == 2)//全量
// {
// TUint8 blackType = array[i]->black_type +'0';
// TBuf8<64> sqlBuf(_L8("delete from s_black_list_call where cat_id = '"));
// sqlBuf.Append(blackType);
// sqlBuf.Append(_L8("';"));
// iDbOperator->Update(sqlBuf);
// }

if(array[i]->update_type == 0 || array[i]->update_type == 2)//新增
{
if(array[i]->black_mode = 1)//电话黑名单
{
strcpy(sqlBuf,"select number from s_black_list_call where number = '");
strcat(sqlBuf,array[i]->phone_num);
strcat(sqlBuf,"';");
iSqlObserverInUi = ETrue;
iDbOperator->Select(sqlBuf);
iSqlObserverInUi = EFalse;
if(iNumberDiscovered)
{
iNumberDiscovered = EFalse;
TRACE("The same number was found");
continue;
}
memset(sqlBuf,'\0',256);

strcpy(sqlBuf,"INSERT INTO s_black_list_call (number,cat_id,region_code,intercept) VALUES ('");
}
else
{
strcpy(sqlBuf,"INSERT INTO s_black_list_sms (number,cat_id,region_code,intercept) VALUES ('");
}
strcat(sqlBuf,array[i]->phone_num);
strcat(sqlBuf,"','");
sqlBuf[strlen(sqlBuf)] = array[i]->black_type +'0';
// strcat(sqlBuf,&(array[i]->black_type));
strcat(sqlBuf,"','");
strcat(sqlBuf,array[i]->area_code);
strcat(sqlBuf,"','1');");
iDbOperator->Insert(sqlBuf);
}
else //删除
{

}
}


以前不知道sqlite回调的那个ptr要释放。以前更新和插入100个以内是可以的,超过200个,打ptr:“database disk image is malformed”,再后来,会打印出out of memory的问题。而且使用sqlite,在select的时候没有内存泄露,在插入或更新的时候就有内存泄露。
漁_夫 2011-06-21
  • 打赏
  • 举报
回复
首先,你对失败得操作不对。针对失败得操作,sqlite会把错误信息放在ptr里面得。也就是这个时候你需要手动释放ptr. 然后那个 KERN-EXEC 3,我估计是你得代码逻辑不严谨。 内存不足得情况下,你new一些对象实例就会失败,但是你在使用之前没有判空。所以导致 KERN-EXEC 3

void CDbOperator::Insert(const char* aSqlString)
{
char* ptr ;

int result = sqlite3_exec(iDb,aSqlString,NULL,NULL,&ptr);
if(result != 0)
{
TRACE(ptr);//errors will be written into my log
// add below free code
free(ptr);

}
}

下面是sqlite3_exec执行后返回的错误提示(即日志里记录的ptr--TRACE(ptr);):
“database disk image is malformed”

这个问题是因为你存得格式不对。BOLB格式得?你自己可以查一下。
ss88009 2011-06-21
  • 打赏
  • 举报
回复
void CDbOperator::Insert(const char* aSqlString)
{
char* ptr ;

int result = sqlite3_exec(iDb,aSqlString,NULL,NULL,&ptr);
if(result != 0)
{
TRACE(ptr);//errors will be written into my log
}
}


我用sqlite3_exec执行插入语句,插入超过大约100次,过一会,就会有KERN-EXEC 3的错误,查看日志,应该是内存不足。

形参aSqlString ="INSERT INTO s_black_list_call (number,cat_id,region_code,intercept) VALUES ('19802301161','1','023','1');" 如此之类。

下面是sqlite3_exec执行后返回的错误提示(即日志里记录的ptr--TRACE(ptr);):
“database disk image is malformed”
"揶揶揶揶揶揶揶揶揶揶揶揶揶揶"
最后,在执行了大约1000次后,输出的错误为"out of memory"几次之后,直接KERN-EXEC 3的错误,程序退出。

查看数据库,里面被插入的只有200左右的数据。

后来,我每插完100次,就close掉,然后再打开,还是会有内存不足的错误。
然后,用hooklogger跟踪,是在mem1.cpp里有内存泄漏。
是不是在执行完sqlite3_exec后,要释放内存,要怎么释放内存?哪位大大有拯救俺的办法,请指教!

谢谢!
漁_夫 2011-06-17
  • 打赏
  • 举报
回复
代码贴上来我看看。

3,120

社区成员

发帖
与我相关
我的任务
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
  • Symbian社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧