Размер IndexedDB продолжает расти, хотя сохраненные данные не меняются

Я использую Redux Persist и LocalForage в моем веб-приложении. У меня есть ряд действий, которые запускаются при входе в систему, которые обновляют некоторые данные о пользователе. Размер IndexedDB после выполнения всех действий и сохранения данных в формате JSON в indexedDB составляет ~1,4 МБ.

Начальное хранение

Однако, если я обновлю страницу, что снова вызовет действия, или если я выйду из системы и снова войду, даже если значения внутри IndexedDB НЕ меняются (я дважды проверил с помощью инструмента сравнения JSON), размер хранилища продолжает расти. В конце концов Chrome очистит часть его после того, как он вырастет на несколько МБ, но не вернется к исходному правильному размеру.

Большой объем хранилища

IndexedDB JSON точно такой же, никаких отличий, но огромная разница в размере. Кто-нибудь знает, почему это происходит и как я могу предотвратить это? Я также хотел бы знать, когда и как часто Chrome очищает любые данные, которые загромождают мою IndexedDB, но я не смог найти для этого никакой ссылки.

Большое спасибо


person slyfox42    schedule 30.07.2018    source источник
comment
Я нашел этот вопрос после того, как обнаружил, что моя IndexedDB выросла до 37 ГБ для контента стоимостью 1 ГБ. Вы нашли решение для сжатия/сжатия базы данных?   -  person Scuzzy    schedule 13.02.2019


Ответы (2)


Chrome использует LevelDB в качестве резервного хранилища для Indexed DB. Вы можете узнать больше о LevelDB по адресу: https://github.com/google/leveldb.

LevelDB оптимизирован для быстрого чтения и записи. Пространство лениво восстанавливается за счет уплотнения.

person Joshua Bell    schedule 07.08.2018

Я заметил такое же поведение в веб-приложении, над которым сейчас работаю.
Проведя некоторое исследование, я обнаружил, что Chrome сохраняет старые (удаленные) файлы базы данных и только помечает их как удаленные. Кроме того, он, вероятно, выполнит некоторую оптимизацию производительности, которая со временем может увеличить пространство.
Но как только он достигнет определенного размера, он автоматически попытается сжать базу данных. Я хотел подтвердить это поведение и добавил код, который автоматически перезагружает веб-страницу после записи данных в базу данных.
В моем случае пространство, необходимое для IndexedDB, увеличилось примерно до 3,3 МБ. Как только он достиг этого размера, он был сжат примерно до 1,3 МБ и снова начал расти.

person Springrbua    schedule 04.04.2019
comment
То же самое. Я также заметил, что размер, в котором он сжимает / очищает данные, является переменным и имеет тенденцию к увеличению, но в какой-то момент он снова все очищает. Я пробовал со своим 300k db, сначала он очистился с 3,3 МБ до ~ 1 МБ, затем он продолжал расти, и через некоторое время он был ~ 10 МБ, когда он очистился до ~ 8 МБ, а затем, когда я достиг ~ 13 МБ, вернулся к 1,5 МБ. - person dvdpzzt; 19.09.2019
comment
К сожалению, это особенно сложно при работе с чрезвычайно ограниченными квотами (например, на SoC или встроенных устройствах). Я проверил квоту 2 МБ на наборе данных размером всего 440 КБ, и после нескольких перезагрузок он раздулся до >2 МБ, после чего он застрял в состоянии ошибки, выдавая QuotaExceededError, хотя хранилище объектов каждый раз очищается, а набор составляет ‹500kb. ???? - person chunk_split; 09.06.2021