首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C++ blob在Sqlite3程序中消耗内存

使用C++ blob在Sqlite3程序中消耗内存
EN

Stack Overflow用户
提问于 2015-11-22 23:35:18
回答 1查看 363关注 0票数 6

我在C++程序中使用blob数据库管理系统,主要用于将文件存储为blob对象(我知道这不是最好的选择)。

显然,我是递增地编写blob的,因为它们有时可能很大(40-80MB),为了这样做,我必须首先使用绑定函数sqlite3_bind_zeroblob(...)创建blob的占位符,然后以增量的方式打开blob的写入和读取。

我面临的问题是,当我创建blob占位符(在sqlite3_step期间)时,我的应用程序的内存消耗达到80-160 3MB,持续2-3秒,一旦创建,内存消耗最多可以回到2-3MB。

我不明白为什么!如果他们创建了一种增量写入blob的方法,那么肯定有一种方法可以在不浪费160 it内存的情况下创建那个愚蠢的占位符,但我没有找到它。你有什么建议吗?

代码语言:javascript
复制
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 successfully\n");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-21 15:17:01

这里报道,这是一个问题。

官方的回答是:

为了像上面那样工作(不管它有多大,都要使用固定的内存),所有的零字节都必须在行的末尾。换句话说,接收零值的表中的列必须是表中的最后一列。如果在zeroblob后面有任何非零的内容,则zeroblob被展开为零字节的文字序列,这意味着必须为整个zeroblob分配内存。

因此,您需要更改顺序来修复它:

代码语言:javascript
复制
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 successfully\n");
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33861572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档