c++ - SQLite C/C++ 接口(interface) : memory increasing while insert data into table

标签 c++ c sqlite

我是 SQLite 的新手。我尝试通过 C/C++ 接口(interface)创建数据并将其插入给定数据库。问题是当我运行程序时内存不断增加。插入的数据越多,使用的内存就越多。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <string.h>

using namespace std;

void execute(char* sql, sqlite3 *&db)
{// execute a command
sqlite3_stmt *stm = NULL;
int rc = 0;

rc = sqlite3_prepare_v2(db,sql,-1,&stm,NULL);
rc = sqlite3_step(stm);
sqlite3_finalize(stm);

stm = NULL;

return;
}

int main()
{
char *tam = new char[256];
sqlite3* db;
sqlite3_open("bangso.db",&db);
sprintf(tam,"COMMIT;");
execute(tam,db);
sprintf(tam,"PRAGMA synchronous=OFF;");
execute(tam,db);
sprintf(tam,"PRAGMA count_changes=OFF;");
execute(tam,db);
sprintf(tam,"PRAGMA journal_mode=MEMORY;");
execute(tam,db);
sprintf(tam,"PRAGMA temp_store=MEMORY;");
execute(tam,db);
sprintf(tam,"BEGIN;");
execute(tam,db);


for(int i=0;i<10000;i++){
    sprintf(tam,"insert into bangso(id,so) values(%d,%d);\n",i+1,i);
    execute(tam,db);
    sprintf(tam,"create table a%d(id int);\n",i);
    execute(tam,db);
    if(i%1000==0) printf("> %d\n",int(sqlite3_memory_used()));
}


sprintf(tam,"COMMIT;");
execute(tam,db);
sqlite3_close(db);


delete [] tam;
tam = NULL;

}

我觉得函数sqlite3_finalize并没有释放所有内存。谢谢。

最佳答案

SQLite 库将所有​​表的元数据保存在内存中。当您的数据库有 10000 个表时,您会耗尽这 10000 个表的内存。

关于c++ - SQLite C/C++ 接口(interface) : memory increasing while insert data into table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45149404/

相关文章:

c++ - 如何在 std::map 中使用结构?

c++输出流不适用于模板和 namespace

c++ - LLVM万花筒教程JIT编译问题

c++ - 单击按钮时将值增加 1 C++

c - 如何使用相同的函数对 C 中的字符串进行 XOR 加扰并再次加扰?

c - 调用 fread 后奇怪的 printf 行为

android SQLite 没有这样的表(代码 1)错误

c - 我在 C 语言中打开文件时遇到问题

android - SQLite 以外的 Android 数据库工具?

c# - 从 C# 代码从 SQLite 导入/导出 CSV