Как найти размер хранилище localStorage


в настоящее время я разрабатываю сайт, который будет использовать localStorage HTML5. Я прочитал все об ограничениях размера для разных браузеров. Однако я ничего не видел о том, как узнать текущий размер экземпляра localStorage. Этот вопрос, похоже, указывает на то, что JavaScript не имеет встроенного способа отображения размера для данной переменной. Имеет ли localStorage свойство размера памяти, которое я не видел? Существует ли простой способ сделать это, что я не хватает?

мой сайт предназначен для того, чтобы пользователи могли вводить информацию в "автономном" режиме, поэтому очень важно иметь возможность предупреждать их, когда хранилище почти заполнено.

13 75

13 ответов:

выполните этот фрагмент в консоли Chrome

var _lsTotal=0,_xLen,_x;for(_x in localStorage){_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){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")); 

П. С. фрагменты обновляются по запросу в комментарии. Теперь расчет включает в себя длину самого ключа. Каждая длина умножается на 2, потому что символ в javascript хранится как UTF-16 (занимает 2 байта)

уходя от того, что @Shourav сказал выше, я написал небольшую функцию, которая должна точно захватить все вашиlocalStorage ключи (для текущего домена) и вычислите общий размер, так что вы точно знаете, сколько памяти занимают ваши

IE имеет remainingSpace свойство объекта хранения. В других браузерах нет equivilant в это время.

Я считаю, что по умолчанию объем пространства составляет 5 МБ, хотя я не проверял его лично.

вот простой пример как это сделать и должно работать с каждым браузером

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

надеюсь, что это поможет кому-то.

потому что Жас - пример на jsfiddle не работает для меня, я придумал это решение. (спасибо Сергею Селецкому и Шораву за их биты, которые я использовал в коде ниже)

Ниже приведена функция, которая может быть использована для проверки того, сколько места доступно для localStorage и (если какие-либо ключи уже находятся в lS), сколько места осталось.

это немного грубая сила, но она работает почти в каждом браузере... кроме Firefox. Хорошо в desktop 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 Pad 1.7 ~1130ms 5Mb
  • Firefox 20.0 (Beta 20.0) разбился как
  • хром 25.0.1364.169 ~22250ms / 5Mb
  • родной (идентифицируется как Safari 4.0 / Webkit534. 30) ~995ms / 5Mb

iPhone 4s iOS 6.1.3

  • Safari ~ 520ms / 5Mb
  • как HomeApp ~525ms / 5Mb
  • iCab ~ 710ms / 5mb

MacBook Pro OSX 1.8.3 (Core 2 Duo 2.66 8GB memory)

  • Safari 6.0.3 ~105ms / 5Mb
  • в Chrome 26.0.1410.43 ~3400ms /5Mb
  • Firefox 20.0 300150ms(!) / 10Mb (после жалобы на скрипт работает долго)

iPad 3 iOS 6.1.3

  • Safari ~430ms / 5Mb
  • iCab ~595ms / 5mb

Windows 7-64b (Core 2 Duo 2.93 6GB memory)

  • Safari 5.1.7 ~80ms / 5Mb
  • Chrome 26.0.1410.43 ~1220ms / 5Mb
  • Firefox 20.0 228500ms(!) /10 МБ (после жалуюсь на то, что скрипт работает долго)
  • IE9 ~17900ms / 9.54 Mb (если есть консоль.логи в коде не работают пока DevTools не откроются)
  • Opera 12.15 ~4212ms / 3.55 Mb (это когда 5MB выбран, но Opera спрашивает красиво, если мы хотим увеличить количество lS, к сожалению, он падает, если тест проводится несколько раз подряд)

Win 8 (Под Параллелями 8)

  • IE10 ~7850ms /9.54 Mb

вы можете вычислить localstorage следующими методами:

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());

наконец размер в байтах будет зарегистрирован в браузере.

Я бы использовал код @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)';
    };

в дополнение к ответу @serge, который больше всего проголосовал здесь, необходимо учитывать размер ключей. Код ниже добавит размер ключей, хранящихся в localStorage

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

как следует из спецификации, каждый символ строки составляет 16 бит.

но проверка с помощью chrome (Настройки>Настройки контента>файлы cookie и данные сайта) показывает нам, что инициирование localStorage занимает 3 КБ (верхний размер)

и размер сохраненных данных следует за этим соотношением (с точностью до 1 кб)
3 + ((localStorage.x. длина*16)/(8*1024)) КБ

где localStorage.x-это ваша строка хранения.

способ, которым я решил эту проблему, заключается в создании функций для поиска используемого пространства и оставшегося пространства в локальном хранилище, а затем функции, которая вызывает эти функции, чтобы определить максимальное пространство для хранения.

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;
}

/ / память занимают как ключ, так и значение, поэтому обновленный код.

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]);

вы можете получить текущий размер данных локального хранилища с помощью функция Blob. Это может не работать в старых браузерах.

пример:

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