Web Storage の残容量を調べてみた

Web Storage に保存可能なデータ量を計測してみました。

Browser Max
Firefox3.5.3 5MB
Firefox3.6β5 4.99MB
iPhone 3.1.2 2.49MB
Safari4 50MB以上
Chrome 4 2.49MB
IE8 2.22MB
Opera10.50 2.49MB

(バッド)ノウハウ

iPhone で容量オーバーを回避する

既存のデータと上書するデータの合計が 2.4MBを超える場合に容量オーバーが発生します。回避するには、一度空文字列で上書します。

var db = window.localStorage;

db["a"] = ""; // 空文字列で上書(削除)
db["a"] = "......."; // 設定
IE8 には残量を示す localStorage.remainingSpace がある

IE8 の localStorage には、HTML5 の仕様に無いプロパティ remainingSpace が存在します。初期値は 2329405 (約2.22MB) です。

Firefox3.6β5 は連続アクセスで OS のスワップを食いつぶす

ある程度データを格納した状態で、localStorage に数byteのデータを連続で書き込むと、100MB単位でOSのスワップを食いつぶす現象が発生します。数秒〜数十秒でメモリを開放するようですが、アプリケーションのほとんどがスワップアウトしてしまい、全体が不安定になるケースもありました。

Firefox3.5.3 では発生しないようです。

Safari4 の上限値は不明

Safari4 が 計測中に落ちてしまうため最大値は不明です。50MBまではいけました。

SharedObject は、一度に 98kBまでのデータを格納できる

Flash Storage(SharedObject) のデフォルト容量は 100kB ということですが、利用可能な容量は 99kB までと考えるべきです(それ以上要求するとユーザに許可を求めるダイアログが出てしまう)。

また、一度に 99kB のデータを入れようとすると容量オーバーと言われてしまいます。98kBのデータと1kBのデータ(合計99kB)を格納することは可能です。

Cookie は 4kB をフルに利用できない

Cookie は 4kB 程度のデータを入れられるはずですが、IE で容量をギリギリまで利用しようとすると、データの安全性に問題が発生するようです。
また、Cookie は他のライブラリからも利用されるため、ストレージとしての最大値は 3.8kB ぐらいかなと。

IEStorage (userData behavior) はキーに制限がある

a-zA-Z_[a-zA-Z0-9_]* は OK で、それ以外はエラーになります。
内部的には、setAttriute(key, value) が走るので、Ident の制限ってことになりますね。もちろん urlencode 等で回避もできます。

Opera10.10 の Unite は存在しないファイルの扱いが GET と HEAD で異なる

GET → 404, HEAD → 200
バグかな?

uupaa.js で利用可能なストレージ容量の一覧

Web Storage (localStorage) Max
Firefox3.5.3 4.9MB
Firefox3.6β5 4.9MB
iPhone 3.1.2 2.4MB
Safari4 8MB
Chrome 4 2.4MB
IE8 2.2MB
Opera10.50 2.4MB
IEStorage (userData behavior)
IE6〜IE8 63kB
FlashStorage (SharedObject)
FlashPlayer8+ 99kB
CookieStorage (Cookie)
any 3.8kB

uu.storage.info() が { use, max, free } を返します。max の値は上記の表の値になります。

Web Storage の容量は、localStorage と sessionStorage で共用です。実際に利用可能な容量はもっと少ない場合があります。
Cookie Storage はセッショントラッキング用の Cookie などと共用なので、実際に利用可能な容量はもっと少ない場合があります。