使用Sqlite3 blob在C++程序中使用RAM

Gal*_*one 5 c++ sqlite blob

我在C++程序中使用sqlite3 dbms,主要用于将文件存储为blob对象(我知道这不是最佳选择).

很显然,我写出来递增,因为他们有时可能大(40-80MB)为了做到这一点我必须使用绑定功能,首先创建Blob的一个占位符sqlite3_bind_zeroblob(...),之后我打开BLOB写入和并将其逐步阅读.

我面临的问题是,当我创建blob占位符(期间sqlite3_step)时,我的应用程序的RAM消耗达到80-160MB,持续2-3秒,一旦创建,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 successfully\n");
}
Run Code Online (Sandbox Code Playgroud)

Ram*_*ama 3

这是此处报告的问题。
而官方给出的答案是:

为了使零斑点按上述方式工作(使用固定量的内存,无论它们有多大)所有零斑点都必须位于行的末尾。换句话说,接收 Zeroblob 的表列必须是表中的最后一列。如果 Zeroblob 后面有任何非零内容,则 Zeroblob 将扩展为零字节的文字序列,这意味着必须为整个 Zeroblob 分配内存。

所以你需要改变顺序来修复它:

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");
}
Run Code Online (Sandbox Code Playgroud)