VC 中使用 sqlite3 多数据下性能如此低下, 是我不会用么?

jasonabc1 2016-03-17 12:00:39
数据库 11M 大小, 大约 15W 条数据, 27 个字段。

Release 下
做一次 Select , 目测用时

r = sqlite3_get_table(m_Sqlite,mSqlString,&mResult,&mRows,&mColumns,&m_cErrmsg);
大约用时几秒钟, 没关系, 我知道数据很大

可是, 没想到的是

sqlite3_free_table(mResult);

释放语句居然需要几分钟才能释放完毕, 这是我使用错误, 还是它的Debug ?

SQLITE_API void sqlite3_free_table(
char **azResult /* Result returned from from sqlite3_get_table() */
){
if( azResult ){
int i, n;
azResult--;
assert( azResult!=0 );
n = SQLITE_PTR_TO_INT(azResult[0]);
for(i=1; i<n; i++){ if( azResult[i] ) sqlite3_free(azResult[i]); }
sqlite3_free(azResult);
}
}
分是折开释放的, 但也用不了这么久吧。。。 这算什么啊~~

请问大家有更好的SQLLITE读取方案吗? 大数据, 多字段的。
...全文
241 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jasonabc1 2016-05-21
  • 打赏
  • 举报
回复
引用 2 楼 laassue 的回复:

sqlite3* SqlDatabase = NULL;
sqlite3_stmt* Stmt = NULL;
CHAR SqlText[256] = { 0 };
const unsigned char* szText = NULL;
PCHAR SqlError = NULL;
ULONG Id = 0;
LPVOID DataBase = NULL;
ULONG DataSize = 0;

if (sqlite3_open16(m_DatabaseFileName, &SqlDatabase) == SQLITE_OK)
{
    sprintf_s(SqlText, _countof(SqlText), "select * from %s;", m_DatabaseTableName);
    if (sqlite3_prepare(SqlDatabase, SqlText, strlen(SqlText), &Stmt, (const char**)&SqlError) == SQLITE_ROW)
    {
        while (sqlite3_step(Stmt) == SQLITE_ROW)
        {
            Id = sqlite3_column_int(Stmt, 0);
            DataBase = (PVOID)sqlite3_column_blob(Stmt, 1);
	    DataSize = sqlite3_column_bytes(Stmt, 1);

            //进行一些操作
            ....
        }
        sqlite3_finalize(Stmt);
    }
    sqlite3_close(SqlDatabase);
}
这样呢?
这样是有效的, 但是你想取出数据, 存为一个结果集, 还是会有同样问题, 不过可以想办法归避, 事实上释放慢也是内存碎片的问题。 谢谢
0x03ff 2016-03-18
  • 打赏
  • 举报
回复

sqlite3* SqlDatabase = NULL;
sqlite3_stmt* Stmt = NULL;
CHAR SqlText[256] = { 0 };
const unsigned char* szText = NULL;
PCHAR SqlError = NULL;
ULONG Id = 0;
LPVOID DataBase = NULL;
ULONG DataSize = 0;

if (sqlite3_open16(m_DatabaseFileName, &SqlDatabase) == SQLITE_OK)
{
    sprintf_s(SqlText, _countof(SqlText), "select * from %s;", m_DatabaseTableName);
    if (sqlite3_prepare(SqlDatabase, SqlText, strlen(SqlText), &Stmt, (const char**)&SqlError) == SQLITE_ROW)
    {
        while (sqlite3_step(Stmt) == SQLITE_ROW)
        {
            Id = sqlite3_column_int(Stmt, 0);
            DataBase = (PVOID)sqlite3_column_blob(Stmt, 1);
	    DataSize = sqlite3_column_bytes(Stmt, 1);

            //进行一些操作
            ....
        }
        sqlite3_finalize(Stmt);
    }
    sqlite3_close(SqlDatabase);
}
这样呢?
oyljerry 2016-03-17
  • 打赏
  • 举报
回复
要看数据有多大,sqlite毕竟是轻量级数据库,不能支持太大数据量

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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