Chrome の IndexedDB ストレージの効率化

Chrome の新しい最適化により、IndexedDB データがディスクに保存される方法が改善されました。この機能強化では、Chrome のストレージ システム内で大きな値を管理する方法に重点を置いています。具体的には、ディスクに保存されている特定のファイルに圧縮を導入しています。この記事では、この更新の要点をまとめています。

バージョン 129 より前の Chrome のストレージ メカニズム

Chrome は LevelDB を使用して IndexedDB データをディスクに保存します。LevelDB は高速な Key-Value ストレージ ライブラリですが、個々の値がデータベース ページのサイズを超えると、パフォーマンスが低下します。この問題に対処するため、2017 年以降、Chrome では 1 ページを超える値をデータベース ファイルの横にプレーン ファイルとしてディスクに保存しています。

バージョン 129 のストレージ

大きな値の圧縮

LevelDB データベース内に直接保存されるコンテンツは、ディスクに書き込まれる前に圧縮され、読み取られた後に解凍されますが、単純なファイルとして保存される大規模なファイルは圧縮されませんでした。今回の更新により、Chrome は Snappy リアルタイム圧縮ライブラリを使用してこれらの大きなファイルを圧縮し、大幅な容量節約を実現します。これは、JavaScript 値、XML、JSON の大きな配列などの構造化データに特に効果的です。サイズが大きいもののすでに圧縮されているメディア ファイルや、サイトが独自に圧縮と解凍を行っている場合は効果がありません。

ストレージ効率への影響

圧縮によってファイルサイズが LevelDB ページのサイズを下回ると、データは LevelDB に戻されます。この変更により、スペースを節約できるだけでなく、ディスク I/O オペレーションも削減され、全体的なパフォーマンスが向上します。

Snappy 圧縮アルゴリズム

Chrome チームは、最大圧縮ではなく速度を重視して最適化される Snappy を圧縮に選択しました。圧縮や圧縮解除中に測定可能なパフォーマンスの低下が発生しないほど高速です。

パフォーマンスの改善

圧縮と解凍は、Chrome のマルチプロセス アーキテクチャの一部であるレンダラ プロセス内で処理されます。これにより、ブラウザ プロセスに送信されるメッセージのサイズが小さくなり、パフォーマンスがさらに向上します。合成ベンチマークでは、IPC(プロセス間通信)とディスク I/O の削減により、一部のオペレーションが以前の 2 ~ 3 倍の速さで実行されることが示されています。実際に、Chrome チームの測定では、1 MB の構造化データ ペイロードがディスクからページに配信される時間は、約 4 分の 1 に短縮されています(デバイスのハードウェアとシステム アクティビティによって変動が大きくなります)。

デベロッパーとユーザーへの影響

これらの変更は、デベロッパーとユーザーの両方にとって完全に透過的です。ただし、パフォーマンスの向上とストレージ使用量の削減が期待できます。

  • 容量の節約: 圧縮は、この更新後に保存された新しいデータにのみ適用されます。節約された容量は、navigator.storage.estimate() などのウェブ API を使用して間接的に確認できます。また、Chrome DevTools の [Storage] セクション([Application] パネル内)でも確認できます。
  • 機能のテスト: デベロッパーは、フラグ --enable-features="IndexedDBCompressValuesWithSnappy" を使用して機能を有効にすることで、Chrome のプレリリース版(129 より前)でこの動作をテストできます。

このアップデートにより、Chrome での大規模な IndexedDB 値の管理効率が向上し、パフォーマンスを損なうことなくスペースと時間の両方を節約できるようになりました。これにより、ブラウザでのデータの保存とアクセス方法が大幅に改善されます。デベロッパーは、これらの変更を理解することで、Chrome のパフォーマンスとストレージ メカニズムの最適化に向けた継続的な取り組みからメリットを得て、よりスムーズで効率的なユーザー エクスペリエンスを実現できます。

謝辞

このドキュメントは、Evan StadeRachel Andrew が確認しました。