Потребление ОЗУ внутри программы на С++ с использованием Sqlite3 blob

Я использую sqlite3 dbms внутри программы на С++, которую я использую в основном для хранения файлов в виде объектов blob (я знаю, что это не самый лучший вариант).

Очевидно, я записываю их поэтапно, так как они иногда могут быть большими (40-80 МБ), чтобы сделать это. Мне нужно сначала создать местозаполнитель blob с помощью функции привязки sqlite3_bind_zeroblob(...), после чего я открою запись blob и чтение пошагово от и до него.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я создаю placeblob placeholder (во время sqlite3_step), потребление RAM моего приложения достигает 80-160 МБ в течение 2-3 секунд, как только оно было создано, потребление ОЗУ возвращается к Максимум 2-3 МБ.

Я не понимаю почему! Если они создавали способ записи в блоб поэтапно, наверняка есть способ создать этот глупый заполнитель без потери 160 МБ ОЗУ, но я его не нашел. У вас есть предложение?

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");
}
1 ответ

Сообщается о проблеме ЗДЕСЬ. И официальный ответ:

Для того, чтобы 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");
}

licensed under cc by-sa 3.0 with attribution.