localStorageのサイズを確認する方法


117

現在、HTML5のlocalStorageを利用するサイトを開発しています。さまざまなブラウザーのサイズ制限についてすべて読みました。ただし、localStorageインスタンスの現在のサイズを確認する方法については何も見ていません。この質問は、JavaScriptには特定の変数のサイズを表示する組み込みの方法がないことを示しているようです。localStorageには、見たことのないメモリサイズプロパティがありますか?これを行う簡単な方法はありますか?

私のサイトは、ユーザーが「オフライン」モードで情報を入力できるようにすることを目的としているため、ストレージがほぼいっぱいになったときに警告を表示できることが非常に重要です。


回答:


219

JavaScriptコンソール(1行バージョン)でこのスニペットを実行します。

var _lsTotal=0,_xLen,_x;for(_x in localStorage){ if(!localStorage.hasOwnProperty(_x)){continue;} _xLen= ((localStorage[_x].length + _x.length)* 2);_lsTotal+=_xLen; console.log(_x.substr(0,50)+" = "+ (_xLen/1024).toFixed(2)+" KB")};console.log("Total = " + (_lsTotal / 1024).toFixed(2) + " KB");

同じコードを複数行で読むために

var _lsTotal = 0,
    _xLen, _x;
for (_x in localStorage) {
    if (!localStorage.hasOwnProperty(_x)) {
        continue;
    }
    _xLen = ((localStorage[_x].length + _x.length) * 2);
    _lsTotal += _xLen;
    console.log(_x.substr(0, 50) + " = " + (_xLen / 1024).toFixed(2) + " KB")
};
console.log("Total = " + (_lsTotal / 1024).toFixed(2) + " KB");

または、このテキストをブックマークの「場所」フィールドに追加して、便利に使用できます

javascript: var x, xLen, log=[],total=0;for (x in localStorage){if(!localStorage.hasOwnProperty(x)){continue;} xLen =  ((localStorage[x].length * 2 + x.length * 2)/1024); log.push(x.substr(0,30) + " = " +  xLen.toFixed(2) + " KB"); total+= xLen}; if (total > 1024){log.unshift("Total = " + (total/1024).toFixed(2)+ " MB");}else{log.unshift("Total = " + total.toFixed(2)+ " KB");}; alert(log.join("\n")); 

PSスニペットは、コメントのリクエストに応じて更新されます。これで、計算にはキー自体の長さが含まれます。JavaScriptの文字はUTF-16として格納されるため、各長さは2倍されます(2バイトを占有します)

PPSはChromeとFirefoxの両方で動作するはずです。


8
これをコンソールに貼り付けて合計を確認します。var t = 0; for(var x in localStorage){t + =(((localStorage [x] .length * 2))); } console.log(t / 1024 + "KB");
ヘンリー

5
@Micah Javascriptは内部的にUTF16を使用するため、各文字は2バイトとして格納されるため、実際の使用領域を取得するには、文字数に2を掛ける必要があります。(あなたはおそらくこれをすでに発見しましたが、私は他の誰もが同じ質問をしているのでここで注目する価値があると思いました)
Rebecka

2
@Serge、この答えは、ほとんどここに掲載するので、投票している var t = 0; for(var x in localStorage) { t += (x.length + localStorage[x].length) * 2; } console.log(t/1024+ " KB");
Mihir

17
ここでは、同様のNaNを占めて変更されたバージョンがあります:var _lsTotal = 0, _xLen, _x; for (_x in localStorage) { _xLen = (((localStorage[_x].length || 0) + (_x.length || 0)) * 2); _lsTotal += _xLen; console.log(_x.substr(0, 50) + " = " + (_xLen / 1024).toFixed(2) + " KB") }; console.log("Total = " + (_lsTotal / 1024).toFixed(2) + " KB");
マリオSannum

1
ブックマークレットにバグがあります。メインコードではアンダースコア付きの変数を使用し、ブックマークレットでは通常の名前を使用しています。単一の下線_xはそれを壊します。アンダースコアを削除するだけです。
Soul Reaver

46

上記の@Shouravの発言から離れて、localStorage(現在のドメインの)すべてのキーを正確に取得し、結合されたサイズを計算して、localStorageオブジェクトによってどれだけのメモリが使用されているかを正確に把握できる小さな関数を作成しました。

var localStorageSpace = function(){
        var allStrings = '';
        for(var key in window.localStorage){
            if(window.localStorage.hasOwnProperty(key)){
                allStrings += window.localStorage[key];
            }
        }
        return allStrings ? 3 + ((allStrings.length*16)/(8*1024)) + ' KB' : 'Empty (0 KB)';
    };

鉱山が戻った: "30.896484375 KB"


1
@tennisgentに感謝します。MineはIE11、FF> 26とChromeでも働いていました。
Akki922234 2014年

18

IEには、StorageオブジェクトのremainingSpaceプロパティがあります。現在、他のブラウザには同等の機能はありません。

私はそれを個人的にテストしていませんが、デフォルトの容量は5MBだと思います。


1
これはonlyproperty IEで
jas-

サイトあたり5 MBの制限ですか、それともすべてのサイトで全体ですか?
divyenduz 2014

@divyenduzサイトごと、私は思う
アダム

2
localStorage.remainingSpaceプロパティは、ストレージオブジェクトに許可されている残りのUTF-16文字数を返すことに注意してください。バイト単位の残りのサイズではありません。参照
Mihir、2015年

14

これはこれを行う方法の簡単なであり、すべてのブラウザで動作するはずです

alert(1024 * 1024 * 5 - unescape(encodeURIComponent(JSON.stringify(localStorage))).length);

どこかに* 8は必要ありませんか?
ジョージマウアー2014

1
考慮されない文字セット(つまり、utf8など)に依存する
jas-

サイズはバイト単位ですか、ビット単位ですか?
JamesTheAwesomeDude 2015年

6
この例では、各ブラウザーでlocalStorageが5MB(5 * 1024 * 1024)で同じ固定制限を持つと誤って想定しています。
ビクター

これは、w3cの仕様によるものです。
jas- 2015

13

これが誰かを助けることを願っています。

jsfiddleのJas-exampleが機能しないため、このソリューションを思いつきました。(以下のコードで使用したビットを提供してくれたSerge SeletskyyとShouravに感謝)

以下は、localStorageに使用できるスペースの量と、(すでにキーがlSにある場合)残っているスペースの量をテストするために使用できる関数です。

これは少し力ずくで動作しますが、Firefoxを除くほとんどすべてのブラウザで動作します。まあ、デスクトップFFでは完了するのに時間がかかり(4〜5分)、Androidではクラッシュします。

関数の下には、さまざまなプラットフォームのさまざまなブラウザーで行ったテストの短い要約があります。楽しい!

function testLocalStorage() {
    var timeStart = Date.now();
    var timeEnd, countKey, countValue, amountLeft, itemLength;
    var occupied = leftCount = 3; //Shurav's comment on initial overhead
//create localStorage entries until localStorage is totally filled and browser issues a warning.
    var i = 0;
    while (!error) {
        try {
//length of the 'value' was picked to be a compromise between speed and accuracy, 
// the longer the 'value' the quicker script and result less accurate. This one is around 2Kb 
            localStorage.setItem('testKey' + i, '11111111112222222222333333333344444444445555555555666661111111111222222222233333333334444444444555555555566666');
        } catch (e) {
            var error = e;
        }
        i++;
    }
//if the warning was issued - localStorage is full.
    if (error) {
//iterate through all keys and values to count their length
        for (var i = 0; i < localStorage.length; i++) {
            countKey = localStorage.key(i);
            countValue = localStorage.getItem(localStorage.key(i));
            itemLength = countKey.length + countValue.length;
//if the key is one of our 'test' keys count it separately
            if (countKey.indexOf("testKey") !== -1) {
                leftCount = leftCount + itemLength;
            }
//count all keys and their values
            occupied = occupied + itemLength;
        }
        ;
//all keys + values lenght recalculated to Mb
        occupied = (((occupied * 16) / (8 * 1024)) / 1024).toFixed(2);
//if there are any other keys then our 'testKeys' it will show how much localStorage is left
        amountLeft = occupied - (((leftCount * 16) / (8 * 1024)) / 1024).toFixed(2);
//iterate through all localStorage keys and remove 'testKeys'
        Object.keys(localStorage).forEach(function(key) {
            if (key.indexOf("testKey") !== -1) {
                localStorage.removeItem(key);
            }
        });

    }
//calculate execution time
    var timeEnd = Date.now();
    var time = timeEnd - timeStart;
//create message
    var message = 'Finished in: ' + time + 'ms \n total localStorage: ' + occupied + 'Mb \n localStorage left: ' + amountLeft + "Mb";
//put the message on the screen
    document.getElementById('scene').innerText = message; //this works with Chrome,Safari, Opera, IE
//document.getElementById('scene').textContent = message;  //Required for Firefox to show messages
}

上記で約束したように、さまざまなブラウザーでのいくつかのテスト:

GalaxyTab 10.1

  • Maxthonパッド1.7〜1130ms 5Mb
  • Firefox 20.0(ベータ20.0)は両方をクラッシュさせました
  • クローム25.0.1364.169〜22250ms / 5Mb
  • ネイティブ(Safari 4.0 / Webkit534.30として識別)〜995ms / 5Mb

iPhone 4s iOS 6.1.3

  • サファリ〜520ms / 5Mb
  • HomeAppとして〜525ms / 5Mb
  • iCab〜710ms / 5mb

MacBook Pro OSX 1.8.3(Core 2 Duo 2.66 8Gbメモリ)

  • サファリ6.0.3〜105ms / 5Mb
  • クロム26.0.1410.43〜3400ms / 5Mb
  • Firefox 20.0 300150ms(!)/ 10Mb(スクリプトの実行が長すぎると不平を言った後)

iPad 3 iOS 6.1.3

  • サファリ〜430ms / 5Mb
  • iCab〜595ms / 5mb

Windows 7 -64b(Core 2 Duo 2.93 6Gbメモリ)

  • サファリ5.1.7〜80ms / 5Mb
  • クロム26.0.1410.43〜1220ms / 5Mb
  • Firefox 20.0 228500ms(!)/ 10Mb(スクリプトの実行が長すぎると不平を言った後)
  • IE9〜17900ms /9.54Mb(コードにconsole.logsがある場合、DevToolsを開くまで機能しません)
  • Opera 12.15〜4212ms /3.55Mb(これは5Mbが選択された場合ですが、Isの量を増やしたいかどうかOperaはきちんと尋ねます、残念ながらテストが数回続けて実行された場合クラッシュします)

Win 8(Parallels 8の下)

  • IE10〜7850ms /9.54Mb

素晴らしい実験。しかしarray.forEach()、コードには見つかりましたが、IEには存在しないことがわかっているので、自分で実装しますか?全体のレイテンシへの影響をどのように測定しますか?
Evi Song

おかげで、最初のテストからしばらく時間が経過したので、それらをやり直すかもしれません。についてはforEach()。いいえ、私は自分で実装していませんArray.prototype.forEach()。ストックを使用しました。IE9のMDNとして知られるMozilla Developer Networkによると、これはネイティブサポートされています。
Jakub Gadkowski

ありがとう。私の知識をリフレッシュする必要があります。Array.prototype.forEach()プロジェクトが初期のIEバージョンをサポートしない場合は、後でできるだけ多く使用します。
Evi Song、

コードを作ることができる非常に速い(Chromeで〜Firefoxで2500ms、700ms〜):スプリットwhile二つの部分、のように最初の1にループstackoverflow.com/a/3027249/1235394その後、指数関数的に増大するデータチャンクとのlocalStorageを満たし、第二部でストレージを完全に埋めるための固定サイズの小さなチャンク。テストページ:jsfiddle.net/pqpps3tk/1
Victor

IE10 Rocks ..それでも、Chromeをダウンロードする最速のブラウザー:)
Ruslan Abuzant

11

Blob関数を使用して、ローカルストレージデータの現在のサイズを取得できます。これは古いブラウザでは機能しない可能性があります。サポートを確認してくださいnew BlobObject.values() caniuseで。

例:

return new Blob(Object.values(localStorage)).size;

Object.values()は、localStorageオブジェクトを配列に変換します。Blobは配列を生データに変換します。


3
私が思うにBlob、このかもしれないが、実際に最も信頼性の高い方法であるので、UTF-16の文字列エンコーディングを制限するものではありません。new Blob(['X']).size;= 1に対してnew Blob(['☃']).size(U + 2603 /雪だるまの文字)==> 3.に基づくソリューションString.prototype.lengthはこれを考慮に入れず(「文字」を扱う)、ストレージの割り当て/制限は(バイトを扱う)可能性が高いので、想像できます。これは、たとえば、非英語/ ASCII文字を格納するときに驚きをもたらします。
iX3

ChromeとFFでBlobソリューションをテストするために、文字列の長さでlocalStorageサイズを計算するJedの回答を使用しました。最初のテストでは、localStorageに記号「1」を入力しました。2番目のテストでは、Blobオブジェクトでサイズが大きい ''☃ ''記号でlocalStorageを入力しました。どちらの場合でも、localStorageの最大長はまったく同じです。したがって、文字のBlobサイズはlocalStorageの制限に影響しません。そのため、この目的でBlobを使用しないでください。
ビンセント

6

次の方法でローカルストレージを計算できます。

function sizeofAllStorage(){  // provide the size in bytes of the data currently stored
  var size = 0;
  for (i=0; i<=localStorage.length-1; i++)  
  {  
  key = localStorage.key(i);  
  size += lengthInUtf8Bytes(localStorage.getItem(key));
  }  
  return size;
}

function lengthInUtf8Bytes(str) {
  // Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence.
  var m = encodeURIComponent(str).match(/%[89ABab]/g);
  return str.length + (m ? m.length : 0);
}

console.log(sizeofAllStorage());

最後に、バイト単位のサイズがブラウザに記録されます。


4

私はすべてを取得してコンテンツをカウントする@tennisgenのコードを使用しますが、キー自体をカウントします。

var localStorageSpace = function(){
        var allStrings = '';
        for(var key in window.localStorage){
            allStrings += key;
            if(window.localStorage.hasOwnProperty(key)){
                allStrings += window.localStorage[key];
            }
        }
        return allStrings ? 3 + ((allStrings.length*16)/(8*1024)) + ' KB' : 'Empty (0 KB)';
    };

3

この問題に対処する方法は、ローカルストレージの使用済みスペースと残りのスペースを見つけるための関数を作成し、次にそれらの関数を呼び出して最大ストレージスペースを決定する関数を作成することです。

function getUsedSpaceOfLocalStorageInBytes() {
    // Returns the total number of used space (in Bytes) of the Local Storage
    var b = 0;
    for (var key in window.localStorage) {
        if (window.localStorage.hasOwnProperty(key)) {
            b += key.length + localStorage.getItem(key).length;
        }
    }
    return b;
}

function getUnusedSpaceOfLocalStorageInBytes() {
    var maxByteSize = 10485760; // 10MB
    var minByteSize = 0;
    var tryByteSize = 0;
    var testQuotaKey = 'testQuota';
    var timeout = 20000;
    var startTime = new Date().getTime();
    var unusedSpace = 0;
    do {
        runtime = new Date().getTime() - startTime;
        try {
            tryByteSize = Math.floor((maxByteSize + minByteSize) / 2);
            localStorage.setItem(testQuotaKey, new Array(tryByteSize).join('1'));
            minByteSize = tryByteSize;
        } catch (e) {
            maxByteSize = tryByteSize - 1;
        }
    } while ((maxByteSize - minByteSize > 1) && runtime < timeout);

    localStorage.removeItem(testQuotaKey);

    if (runtime >= timeout) {
        console.log("Unused space calculation may be off due to timeout.");
    }

    // Compensate for the byte size of the key that was used, then subtract 1 byte because the last value of the tryByteSize threw the exception
    unusedSpace = tryByteSize + testQuotaKey.length - 1;
    return unusedSpace;
}

function getLocalStorageQuotaInBytes() {
    // Returns the total Bytes of Local Storage Space that the browser supports
    var unused = getUnusedSpaceOfLocalStorageInBytes();
    var used = getUsedSpaceOfLocalStorageInBytes();
    var quota = unused + used;
    return quota;
}

Array.joinはパフォーマンスキラーです。可能な場合はString.repeatを使用してください(つまり、IEを除くすべての場所を意味します)
pkExec

2

ここで最も投票される@sergeの回答に加えて、キーのサイズを考慮する必要があります。以下のコードは、格納されているキーのサイズを追加しますlocalStorage

var t = 0; 
for (var x in localStorage) { 
    t += (x.length + localStorage[x].length) * 2; 
} 
console.log((t / 1024) + " KB");

場合によっては、Firefoxがundefinedアイテムに対して返されることがわかったlengthので、条件付きを追加に追加しましたt += (x.length + (this.storage[x].length ? this.storage[x].length : 0)) * 2;
camilokawerin 2015年

@camilokawerin、それは未定義の値がストレージに保存されない限り、べきではありません。StringはlocalStorageでサポートされる唯一のタイプであり、StringにはプロパティLengthがあるためです。jsfiddleやそれに似たものにいくつかの例を投稿できますか?
Mihir、2015年

1

仕様として、文字列の各文字は16ビットです。

ただし、Chromeで検査すると([設定]> [コンテンツの設定]> [Cookieとサイトデータ])、localStorageの開始に3kB(オーバーヘッドサイズ)かかることがわかります。

格納されたデータサイズはこの関係に従います(1kBに正確)
3 +((localStorage.x.length * 16)/(8 * 1024)) kB

ここで、localStorage.xはストレージ文字列です。


0

//メモリはキーと値の両方によって占有されるため、更新されたコード。

var jsonarr=[];
var jobj=null;
for(x in sessionStorage) // Iterate through each session key
{
    jobj={}; 
    jobj[x]=sessionStorage.getItem(x); //because key will also occupy some memory
    jsonarr.push(jobj);
    jobj=null;
}
//https://developer.mozilla.org/en/docs/Web/JavaScript/Data_structures 
//JavaScript's String type is used to represent textual data. It is a set of "elements" of 16-bit unsigned integer values. 
var size=JSON.stringify(jsonarr).length*2; //16-bit that's why multiply by 2
var arr=["bytes","KB","MB","GB","TB"]; // Define Units
var sizeUnit=0;
while(size>1024){ // To get result in Proper Unit
    sizeUnit++;
    size/=1024;
}
alert(size.toFixed(2)+" "+arr[sizeUnit]);

0

はい、この質問は10年前と同じように尋ねられました。しかし、興味があり(私自身のように、ローカルストレージでデータを保存するオフラインテキストエディターを構築しているため)、プログラミングが苦手な場合は、次のような簡単なものを使用できます。

var warning = 1;
var limit = 2000000; //2 million characters, not really taking in account to bytes but for tested ammounts of characters stored
setInterval(function() {
    localStorage["text"] = document.getElementById("editor").innerHTML; //gets text and saves it in local storage under "text"
    if(localStorage["text"].length > limit && warning == 1){
            alert("Local Storage capacity has been filled"); 
            warning = 2; //prevent a stream of alerts
    }
}, 1000);
//setInterval function saves and checks local storage

ストレージの容量をいっぱいにする最良の方法は、サイトの設定を表示することです(たとえば、ローカルストレージに画像を保存した場合)。少なくともクロムでは、使用されたバイトの量を見ることができます(つまり:1222バイト)。ただし、jsでローカルストレージがいっぱいになっていることを確認する最良の方法はすでに上記で説明されているため、それらを使用してください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.