验证存储在 IndexedDB (Int8Array) 中的数据的大小和类型

Verify size and type of data stored in IndexedDB (Int8Array)

我正在浏览器客户端中设置一个基于 IndexedDB 的虚拟文件系统。我的假设是将类型化数组存储为值会很有效;特别是,我通过 Int8Array 保存了 8 kB 的数据块。我必须用什么方法来验证这个的有效性 - 实际使用 space,实际数据表示?

例如,在 Chromium 中,我可以看到 Int8Array 似乎得到了妥善保存。但是 'Clear Storage' 页面显示了一个可疑的高存储大小 - 91 kB - 虽然我写的第一个测试文件大小只有 40 kB(40096 字节分布在 5 个键上,加上 24 个字节用于元数据键) .键是非常小的数组,包含一个短字符串路径和一个数字。所以看起来存储空间大约是预测的两倍:

相比之下,我在 Firefox 中找不到任何关于使用量的信息,但是存储浏览器只显示值的类型 'Array',并且它们被表示为 JSON 对象非常低效,虽然那可能是 a display issue only:

一个相关的问题是,存储 ArrayBuffer 对象与存储 Int8Array 视图有区别吗?我都试过了,大小上有一个最小的差异(如果我使用 ArrayBuffer 而不是 Int8Array 作为传递给 IDB 的值,Chromium 使用 90.8 kB 而不是 90.9 kB)。

第一:当然,只写一个小文件会使画面失真,因为数据库本身的开销被打折了。所以我改写了一个 40 MB 的文件(现在直接使用 ArrayBuffer),现在 Chromium 报告了不到 41 MB 的存储使用情况,确认数据存储相对紧凑。 Indead 我可以看到实时更新的存储使用量在回到 41 MB 之前暂时更高,表明还有一个 compaction/cleaner 算法 运行。

由于 Firefox 无法显示 file:// 的数据使用情况,我 运行 通过网络服务器进行测试,这里也使用了 41 MB space。


另一个令人惊讶的结果是,巧妙地存储 子数组 Int8Array 实际上似乎也存储了整个后备 ArrayBuffer 内容。因此,虽然在 Chromium 中报告的值 Int8Array(8192),但由于底层 ArrayBuffer 大小(在我的情况下为 64K),存储空间要大得多。从这个意义上说,最好直接存储 ArrayBuffer 实例以避免意外。

顺便说一句,在这个任务中,Firefox 比 Chromium 快大约 3 倍。两者的执行速度仍然非常慢(分别需要 3 秒和 10 秒来执行以 8 KB 的块存储 41 MB 的异步 I/O)。