Как рассчитать размер таблицы IndexedDB в Chrome?

#javascript #google-chrome #indexeddb #pouchdb

#javascript #google-chrome #indexeddb #pouchdb

Вопрос:

Я использую адаптер pouchDB with IndexedDB в браузере Chrome и хочу рассчитать размер каждой базы данных IndexedDB. Я использую код изhttps://github.com/jonnysmith1981/getIndexedDbSize/blob/master/getIndexedDbSize.js для выполнения вычисления.

Я обнаружил, что общий размер баз данных намного превышает использование временного хранилища webkit.

На скриншоте ниже приведен общий объем памяти (255 МБ), используемый моим приложением.

введите описание изображения здесь

Вы увидите, что в IndexedDB сохранено 5 баз данных. И ниже выводится результат вычисления размера каждой базы данных. Вы увидите, что общий размер составляет около 389 МБ. Интересно, почему они совершенно разные. Какой из них правильный?

 --------- _pouch_products -------------
VM1633:51  - attach-seq-store   : 0 B
VM1633:51  - attach-store   : 0 B
VM1633:51  - by-sequence    : 86.7 MB
VM1633:51  - detect-blob-support    : 2 B
VM1633:51  - document-store : 92.3 MB
VM1633:51  - local-store    : 6.1 KB
VM1633:51  - meta-store : 96 B
VM1633:57 TOTAL: 179.0 MB

--------- _pouch_transactions -------------
VM1633:51  - attach-seq-store   : 0 B
VM1633:51  - attach-store   : 0 B
VM1633:51  - by-sequence    : 13.7 KB
VM1633:51  - detect-blob-support    : 2 B
VM1633:51  - document-store : 2.2 KB
VM1633:51  - local-store    : 4.2 KB
VM1633:51  - meta-store : 96 B
VM1633:57 TOTAL: 20.2 KB

--------- _pouch_products-mrview-4c294f20854f412a71c9e7cf2f9cc58f -------------
VM1633:51  - attach-seq-store   : 0 B
VM1633:51  - attach-store   : 0 B
VM1633:51  - by-sequence    : 11.9 MB
VM1633:51  - detect-blob-support    : 0 B
VM1633:51  - document-store : 35.3 MB
VM1633:51  - local-store    : 15.1 MB
VM1633:51  - meta-store : 136 B
VM1633:57 TOTAL: 62.3 MB

--------- _pouch_products-mrview-fdca57d512425c6ed0f20311a4f8d6d1 -------------
VM1633:51  - attach-seq-store   : 0 B
VM1633:51  - attach-store   : 0 B
VM1633:51  - by-sequence    : 86.2 MB
VM1633:51  - detect-blob-support    : 0 B
VM1633:51  - document-store : 44.2 MB
VM1633:51  - local-store    : 17.4 MB
VM1633:51  - meta-store : 136 B
VM1633:57 TOTAL: 147.7 MB
--------- _product_alerts -------------
VM1633:57 TOTAL: 0 B
  

Ответ №1:

API индексированной базы данных не предоставляет способа запрашивать размер баз данных (или хранилищ / индексов). Перевод ключей и значений в байты также выполняется браузером и не виден скрипту. Таким образом, скрипт должен выполнять аппроксимацию, например, вычислять размер всех ключей и значений в хранилище при сериализации в виде строк.

Реализация индексированной базы данных в Chrome использует резервное хранилище под названием leveldb, которое имеет различные оптимизации размера, такие как сжатие префикса ключа и сжатие значений с использованием другой библиотеки под названием «snappy». Строки также могут быть сериализованы как байты различными способами (например, строки JS имеют 16 бит на символ, которые могут быть наивно сохранены как 2 байта на символ или кодироваться в UTF-8 с 1-4 байтами на символ). Хранилище резервных копий также лениво уплотняется при удалении или перезаписи данных, поэтому в конечном итоге оно может временно занимать больше места, чем ему нужно.

Ни одна из этих оптимизаций также не видна скрипту, и все они будут отличаться в разных браузерах, поэтому приближение будет … приблизительным. Учитывая все это, оценка в 389 МБ против 255 МБ, о которых сообщает браузер, довольно хороша!

В Chrome мы экспериментируем с разбивкой по типу, о которой сообщается через navigator.storage.estimate() API, который дает точное значение для каждого типа хранилища (например, Индексированная база данных, кэш или …), хотя он по-прежнему не дает значений для базы данных или хранилища объектов.