簡體   English   中英

使用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消耗達到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");
}

這是一個在這里報道的問題。
而官方的答案是:

為了使zeroblobs如上所述工作(使用固定數量的內存,無論它們有多大),所有zeroblobs必須位於行的末尾。 換句話說,接收zeroblobs的表的列必須是表中的最后一列。 如果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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM