IndexedDB的大小一直在增长,尽管保存的数据没有改变。

12

我在我的Web应用程序中使用Redux PersistLocalForage。我有一系列的操作,在登录时更新一些关于用户的数据。当所有操作都完成并将数据以JSON格式保存在IndexedDB上时,IndexedDB的大小约为1.4Mb。

Initial storage

然而,如果我刷新页面从而再次触发操作,或者退出并重新登录,即使IndexedDB内部的值{{不改变}}(我已经使用JSON diff工具进行了双重检查),存储的大小仍然会不断增长。最终,Chrome将在它增长了几MB后清除其中一些内容,但不会返回到初始正确的大小。

Big storage size

IndexedDB的JSON内容完全相同,没有任何差异,但是大小却有很大的差异。有人知道为什么会发生这种情况以及如何防止它吗? 我还想知道Chrome何时/多久清除我的IndexedDB中的数据,但我找不到任何相关的参考资料。 非常感谢。

我发现这个问题是在发现我的IndexedDB已经增长到了37GB,而它只有1GB的内容。你是否找到了缩小/压缩数据库的解决方案呢? - Scuzzy
2个回答

6

Chrome使用LevelDB作为Indexed DB的后端存储。你可以在以下链接中了解更多关于LevelDB的内容:https://github.com/google/leveldb

LevelDB被优化用于快速读写操作。空间会通过压缩方式懒惰回收。


3

我注意到在我目前正在开发的Web应用程序中出现了相同的行为。
经过一些研究,我发现Chrome会保留旧的(已删除的)数据库文件,并将其标记为已删除。此外,它可能会进行一些性能优化,随着时间的推移可能会增加空间。
但是一旦它达到特定大小,它将自动尝试压缩数据库。 我想确认这种行为,并添加了一些代码,一旦数据被写入数据库,它就会自动重新加载网页。
在我的情况下,IndexedDB所需的空间增长到约3.3MB。一旦它达到这个大小,它就会被压缩到约1.3MB并开始再次增长。


我也有同样的发现。我注意到压缩/清除数据的大小是可变的,并且倾向于上升,但在某些时候会再次清除所有内容。我尝试使用我的300k数据库,起初它从3.3MB清除到约1MB,然后它不断上升,在一段时间后达到了约10MB,当它清除到约8MB时,然后当我达到了约13MB时,它又回到了1.5MB。 - dvdpzzt
不幸的是,当使用极其有限的配额(例如在SoC或嵌入式设备上)时,这尤其棘手。我在一个仅有440kb的数据集上测试了2MB的配额,在几次重新加载后,它会膨胀到> 2MB,此时它会陷入错误状态并抛出“QuotaExceededError”,即使每次都清除对象存储并且集合<500kb。 - patricknelson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接