Размер SQLite3 в базе данных памяти

У меня есть база данных SQLite3 в памяти:

sqlite3* database;
sqlite3_open(":memory:", &database);

Можно ли получить точный размер базы данных в памяти?

Мне нужно отправить базу данных клиенту, не сохраняя ее на диске, и я должен сообщить ему размер.


person Xenogenesis    schedule 12.01.2013    source источник


Ответы (2)


Используйте pragma page_count (умножить на pragma page_size).

person Anton Kovalenko    schedule 12.01.2013
comment
Это не точный размер. Я хочу преобразовать объект базы данных в char *, чтобы отправить его, поэтому мне нужен размер объекта в байтах, а не размер данных, содержащихся в базе данных. char* netData; netData = (char*) database; - person Xenogenesis; 13.01.2013
comment
у него вообще нет возможности работать. Взгляните на struct sqlite3 в исходниках sqlite: многие элементы являются указателями. Как вы будете отправлять указатель на функцию? Указатель мьютекса? - person Anton Kovalenko; 13.01.2013
comment
Хм, ладно... Есть ли возможность сразу экспортировать все записи базы данных в char*, а потом импортировать в другую? - person Xenogenesis; 13.01.2013
comment
Нет, не без временного файла (см. sqlite_backup, как скопировать всю базу данных из памяти в файл). Теоретически вы можете написать бэкенд sqlite VFS для файловой системы в памяти и использовать его для резервного копирования, но это слишком много работы. - person Anton Kovalenko; 13.01.2013
comment
Хорошо, это плохо... Так что у меня нет другого пути, кроме как использовать файл tmp. Спасибо за совет. - person Xenogenesis; 13.01.2013
comment
Учитывает ли это также пространство, занимаемое индексами @AntonKovalenko? Редактировать: после тестов кажется, что да. Однострочник в Python: print('size (MB):', next(db.execute('PRAGMA page_count;'))[0] * next(db.execute('PRAGMA page_size;'))[0] / 1024**2). - person Basj; 28.12.2020

Для этого вы можете использовать sqlite3_memory_used().

Подпрограмма sqlite3_memory_used() возвращает количество байтов памяти, выделенных в данный момент (распределено, но не освобождено).

http://www.sqlite.org/c3ref/memory_highwater.html

person Pedro Alves    schedule 05.03.2013