2015-11-22 5 views
5

私は主にBLOBオブジェクトとしてファイルを保存するために使用するC++プログラムの中でsqlite3 dbmsを使用しています。Sqlite3ブロブを使用したC++プログラム内でのRAM消費

明らかに私はインクリメンタルに書くことができます。そのためには、サイズが大きくて(40〜80MB)、最初にBlobのプレースホルダをsqlite3_bind_zeroblob(...)というバインディング関数を使用して作成し、その後にBLOBの書き込みと読み取りそれから徐々に増加します。

私が直面している問題は、ブロブのプレースホルダー(sqlite3_step中)を作成すると、RAM消費量が2に戻ってしまうと、アプリケーションのRAM消費量が2〜3秒で80〜160MBに達するということです最大で-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"); 
} 
+0

が、これはゼロ書き込みのためのキャッシュの使用でもよいし、最小限にキャッシュサイズを設定してみてください? – fghj

+0

SQLクエリとは何ですか? –

+0

私はキャッシュの値を変更しましたが、何も変わっていないようです。とにかくSQLクエリは、次のstd :: string sql = "INSERT INTOファイル(パス、ハッシュ、DATI、VER、LAST)値(?1、?2、?3、?4、? – GalloCedrone

答えて

2

HEREと報告されている問題です。
そしてoficial答えは次のとおりです。

zeroblobsは(関係なく、彼らがどのように大きな 一定量のメモリを使用して)上記のように動作しないようにするために、すべてのzeroblobsは、行の終わり でなければなりません。つまり、表の列は、ゼロブロブを受け取る であり、表の最後の列でなければなりません。 ゼロ以外のコンテンツがゼロボロブの後に続く場合、ゼロブロブは でゼロバイトのリテラルシーケンスに展開されます。つまり、メモリはゼロバイト全体に対して に割り当てる必要があります。

だからあなたはそれを修正するために変更する必要があります。

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"); 
} 
+0

ありがとう、私はその動作と回避策の説明があることを知っていました! – GalloCedrone

関連する問題