Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+内部的RAM消耗+;使用Sqlite3 blob编程_C++_Sqlite_Blob - Fatal编程技术网

C++ C+内部的RAM消耗+;使用Sqlite3 blob编程

C++ C+内部的RAM消耗+;使用Sqlite3 blob编程,c++,sqlite,blob,C++,Sqlite,Blob,我在一个C++程序中使用了SqLeTe3 DBMS,我主要使用它来存储文件作为BLB对象(我知道这不是最好的选择)。 显然,我是以增量方式编写它们的,因为它们有时可能很大(40-80MB),为了做到这一点,我必须首先使用绑定函数sqlite3\u bind\u zeroblob(…),创建blob的占位符,然后以增量方式打开blob并从中读取 我面临的问题是,当我创建blob占位符时(在sqlite3_步骤期间),我的应用程序的RAM消耗达到80-160MB,持续2-3秒,一旦创建,RAM消耗最

我在一个C++程序中使用了SqLeTe3 DBMS,我主要使用它来存储文件作为BLB对象(我知道这不是最好的选择)。 显然,我是以增量方式编写它们的,因为它们有时可能很大(40-80MB),为了做到这一点,我必须首先使用绑定函数
sqlite3\u bind\u zeroblob(…)
,创建blob的占位符,然后以增量方式打开blob并从中读取

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

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

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");
}
这是一个已报告的问题。
政府的回答是:

为了让ZeroBlob像上面一样工作(使用固定数量的 内存无论有多大)所有的零块都必须在末尾 排在第一位。换句话说,表中 接收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");
}

可能这是零写入的缓存使用情况,请尝试将缓存大小设置为最小值?SQL查询是什么?我修改了缓存值,但似乎没有任何更改。无论如何,sql查询是以下std::string sql=“插入到文件(路径、哈希、数据、版本、最后)值(?1、?2、?3、?4、?5);”;您应该使用
sqlite3\u blob\u open
&friends从增量I/O中获益。我在您的代码中没有看到这一点。我在问题中写了它,首先我需要创建占位符(第3个参数),然后打开它并使用增量I/O写入,问题是创建占位符会浪费大量RAM。从文档-->“zeroblob旨在用作BLOB的占位符,其内容稍后将使用增量BLOB I/O例程写入。zeroblob的负值将导致长度为零的BLOB。”Myabe您被第5个参数的绑定弄糊涂了。非常感谢,我知道这种行为是有原因的,还有可能的解决办法!