#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, который дает точное значение для каждого типа хранилища (например, Индексированная база данных, кэш или …), хотя он по-прежнему не дает значений для базы данных или хранилища объектов.