gpt4 book ai didi

c++ - 使用 Sqlite3 blob 的 C++ 程序中的 RAM 消耗

转载 作者:IT王子 更新时间:2023-10-29 06:29:25 28 4
gpt4 key购买 nike

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

显然,我是逐步编写它们的,因为它们有时可能很大(40-80MB),因此我必须首先使用绑定(bind)函数 sqlite3_bind_zeroblob(...) 创建 blob 的占位符> 之后,我打开 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");
}

最佳答案

这是一个已报告的问题 HERE .
官方的回答是:

In order for zeroblobs to work as above (using a fixed amount of memory no matter how big they are) all zeroblobs must be at the end of the row. In other words, the columns of the table that are receiving the zeroblobs must be the last columns in the table. If any non-zero content follows the zeroblob, then the zeroblob is expanded into a literal sequence of zero bytes, meaning memory must be allocated for the entire 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");
}

关于c++ - 使用 Sqlite3 blob 的 C++ 程序中的 RAM 消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33861572/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com