使用Sqlite3 blob的C++程序内部的RAM消耗
RAM consumption inside a C++ program using Sqlite3 blob
我在C++程序中使用sqlite3 dbms,我主要使用该程序将文件存储为blob对象(我知道这不是最好的选择)。
显然,我是递增地写它们的,因为它们有时可能很大(40-80MB)。为了做到这一点,我必须首先使用绑定函数sqlite3_bind_zeroblob(...)
创建blob的占位符,然后我打开blob,从中递增地写和读。
我面临的问题是,当我创建blob占位符时(在sqlite3_step
期间),我的应用程序的RAM消耗在2-3秒内达到80-160MB,一旦创建,RAM消耗最多会回到2-3MB。
我不明白为什么!如果他们创建了一种增量写入blob的方法,那么肯定有一种方法可以在不浪费160MB RAM的情况下创建那个愚蠢的占位符,但我没有找到。你有什么建议吗?
sqlite3_stmt* stm = NULL;
sqlite3_blob *BLOB = NULL;
rc = sqlite3_prepare_v2(db, sql.c_str(), -1, &stm, NULL);
rc = sqlite3_bind_blob(stm, 1, wpath.c_str(), wpath.size()*sizeof(wchar_t), SQLITE_STATIC);
rc = sqlite3_bind_text(stm, 2, hash.c_str(), hash.size(), SQLITE_STATIC);
rc = sqlite3_bind_zeroblob(stm, 3, size);
rc = sqlite3_bind_int(stm, 4, versione);
rc = sqlite3_bind_blob(stm, 5, last.c_str(), last.size()*sizeof(wchar_t), SQLITE_STATIC);
rc = sqlite3_step(stm);
if (rc != SQLITE_DONE) {
fprintf(stderr, " This file was already present in the database!n", rc);
return;
}
else {
fprintf(stdout, "Record FILE created successfullyn");
}
这是此处报告的问题
而官方的答案是:
为了使零Blob按上述方式工作(使用固定数量的内存,无论它们有多大)所有的零块都必须在最后行的。换句话说,表中接收zeroblobs必须是表中的最后一列。如果任何非零内容都跟在zerobb后面,那么zerobb就是扩展为零字节的文字序列,这意味着内存必须为整个zerobobb分配。
所以你需要更改订单来修复它:
sqlite3_stmt* stm = NULL;
sqlite3_blob *BLOB = NULL;
rc = sqlite3_prepare_v2(db, sql.c_str(), -1, &stm, NULL);
rc = sqlite3_bind_blob(stm, 1, wpath.c_str(), wpath.size()*sizeof(wchar_t), SQLITE_STATIC);
rc = sqlite3_bind_text(stm, 2, hash.c_str(), hash.size(), SQLITE_STATIC);
rc = sqlite3_bind_int(stm, 3, versione);
rc = sqlite3_bind_blob(stm, 4, last.c_str(), last.size()*sizeof(wchar_t), SQLITE_STATIC);
rc = sqlite3_bind_zeroblob(stm, 5, size);
rc = sqlite3_step(stm);
if (rc != SQLITE_DONE) {
fprintf(stderr, " This file was already present in the database!n", rc);
return;
}
else {
fprintf(stdout, "Record FILE created successfullyn");
}
相关文章:
- 将函数类成员映射到类本身内部
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 卷曲bracers内部结构的声明
- 从函数角度看ID到文件路径的内部与外部映射
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 如何在pugixml中获取节点的内部XML
- 使用C链接在函数内部创建C++模板
- 指针没有更新它在void函数内部指向的值
- 方法内部但循环仍得到预期的不合格id错误C++
- C++:具有内部链接的正向声明常量
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- libcurl 和 DNS ttl 中的内部连接管理
- 如何修改 lambda 内部字符串的向量
- 如果我将嵌套映射作为多重映射的值,如何将值插入内部映射?
- 使用Sqlite3 blob的C++程序内部的RAM消耗