API индексированных БД не позволяет запрашивать размер баз данных (или хранилищ / индексов).Перевод ключей и значений в байты также выполняется браузером и невидим для сценария.Таким образом, сценарий должен выполнять приближение, например, вычисляя размер всех ключей и значений в хранилище при сериализации в виде строк.
Реализация индексированной БД в Chrome использует хранилище резервных копий под названием leveldb, которое имеет различные оптимизации размера, такие как сжатие префикса ключа и сжатие значения с использованием другой библиотеки, называемой "snappy".Строки также могут быть сериализованы в виде байтов различными способами (например, строки JS имеют размер 16 бит на символ, который может быть наивно сохранен как 2 байта на символ или кодируется в кодировке UTF-8 до 1-4 байта на символ).Резервное хранилище также лениво сжимается при удалении или перезаписи данных, поэтому может потребоваться больше места, чем требуется временно.
Ни одна из этих оптимизаций также не видна скрипту, и все будут различаться в разных браузерах, поэтомуприближение будет ... приблизительным.Учитывая все это, оценка в 389 МБ по сравнению с 255 МБ, которую сообщает браузер, довольно хорошая!
В Chrome мы экспериментируем с разбивкой по типам, сообщаемой через API navigator.storage.estimate()
, которая даст точныйзначение для каждого типа хранилища (например, индексированная БД против кэша и ...), хотя оно по-прежнему не будет давать значения для хранилища для базы данных или для объекта.