Jaki jest maksymalny rozmiar wartości localStorage?

Ponieważ localStorage (Obecnie) obsługuje tylko ciągi znaków jako wartości, i aby to zrobić, obiekty muszą być stringified (przechowywane jako JSON-string), zanim mogą być przechowywane, czy istnieje określone ograniczenie dotyczące długości wartości.

Czy ktoś wie czy istnieje definicja, która dotyczy wszystkich przeglądarek?

Author: Eric Bishard, 2010-06-07

10 answers

Cytowanie z artykułu Wikipedii na temat pamięci internetowej:

Pamięć internetowa może być postrzegana w uproszczeniu jako ulepszenie plików cookie, zapewniając znacznie większą pojemność pamięci ( 10 MB na pochodzenie w Google Chrome ( https://plus.google.com/u/0 / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / + / +

A także cytując z John Resig Artykuł [opublikowany styczeń 2007]:

Miejsce Przechowywania

Zakłada się, że z DOM Storage, masz znacznie więcej miejsca na dysku przestrzeń niż typowy agent użytkownika ograniczenia nałożone na pliki cookie. Jednak kwota, która jest dostarczana nie jest zdefiniowany w specyfikacji, nie jest też sensownie nadawana przez agent użytkownika.

Jeśli spojrzysz na kod źródłowy Mozilli widzimy, że 5120kb jest domyślnym wielkość pamięci dla całego domena. Daje to znacznie więcej miejsca do pracy z niż typowym 2KB ciasteczko.

Jednak wielkość tej powierzchni magazynowej może być dostosowany przez użytkownika (tak więc 5MB przestrzeni dyskowej nie jest gwarantowana, nie jest to dorozumiane) i agent użytkownika (Np. Opera może jedynie zapewnić 3MB - ale tylko czas pokaże.)

 346
Author: Daniel Vassallo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-15 05:11:01

Właściwie Opera nie ma limitu 5MB. Oferuje zwiększenie limitu, ponieważ aplikacje wymagają więcej. Użytkownik może nawet wybrać "nieograniczoną przestrzeń dyskową" dla domeny.

Możesz łatwo przetestować limity localStorage/quota samodzielnie.

 112
Author: Artemy Tregubenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-15 21:24:43

Oto prosty skrypt do ustalenia limitu:

if (localStorage && !localStorage.getItem('size')) {
    var i = 0;
    try {
        // Test up to 10 MB
        for (i = 250; i <= 10000; i += 250) {
            localStorage.setItem('test', new Array((i * 1024) + 1).join('a'));
        }
    } catch (e) {
        localStorage.removeItem('test');
        localStorage.setItem('size', i - 250);            
    }
}

Oto the gist, JSFiddle i blog post.

Skrypt będzie testował ustawienie coraz większych ciągów tekstu, aż przeglądarka rzuci i wyjątek. W tym momencie wyczyści dane testowe i ustawi klucz size w localStorage przechowujący rozmiar w kilobajtach.

 60
Author: cdmckay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-12 16:32:19

Nie zakładaj, że 5MB jest dostępne - pojemność localStorage różni się w zależności od przeglądarki, z 2.5 MB, 5MB i unlimited są najczęstszymi wartościami. Źródło: http://dev-test.nemikor.com/web-storage/support-test/

 23
Author: tagawa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-10 06:53:15

Znajdź maksymalną długość pojedynczego ciągu, który może być przechowywany w localStorage

Ten fragment znajdzie maksymalną długość łańcucha, który może być przechowywany w localStorage na domenę.

//Clear localStorage
for (var item in localStorage) delete localStorage[item];

window.result = window.result || document.getElementById('result');

result.textContent = 'Test running…';

//Start test
//Defer running so DOM can be updated with "test running" message
setTimeout(function () {

    //Variables
    var low = 0,
        high = 2e9,
        half;

    //Two billion may be a little low as a starting point, so increase if necessary
    while (canStore(high)) high *= 2;


    //Keep refining until low and high are equal
    while (low !== high) {
        half = Math.floor((high - low) / 2 + low);

        //Check if we can't scale down any further
        if (low === half || high === half) {
            console.info(low, high, half);
            //Set low to the maximum possible amount that can be stored 
            low = canStore(high) ? high : low;
            high = low;
            break;
        }


        //Check if the maximum storage is no higher than half
        if (storageMaxBetween(low, half)) {
            high = half;
            //The only other possibility is that it's higher than half but not higher than "high"
        } else {
            low = half + 1;
        }

    }

    //Show the result we found!
    result.innerHTML = 'The maximum length of a string that can be stored in localStorage is <strong>' + low + '</strong> characters.';

    //Functions
    function canStore(strLen) {
        try {
            delete localStorage.foo;
            localStorage.foo = Array(strLen + 1).join('A');
            return true;
        } catch (ex) {
            return false;
        }
    }


    function storageMaxBetween(low, high) {
        return canStore(low) && !canStore(high);
    }

}, 0);
<h1>LocalStorage single value max length test</h1>

<div id='result'>Please enable JavaScript</div>

Zauważ, że długość łańcucha jest ograniczona w JavaScript; jeśli chcesz wyświetlić maksymalną ilość danych, które mogą być przechowywane w localStorage, gdy nie jest ograniczona do pojedynczego łańcucha, możesz użyć kodu w tej odpowiedzi.

Edit: {[16] } Stack Snippets don ' t support localStorage, so Oto link do JSFiddle.

Wyniki

Chrome (45.0.2454.101): 5242878 postacie
Firefox (40.0.1): 5242883 postacie
Internet Explorer (11.0.9600.18036): 16386 122066 122070 znaki

Otrzymuję różne wyniki przy każdym uruchomieniu w Internet Explorerze.

 20
Author: user2428118,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-12 18:52:36

Nie chcesz stringify dużych obiektów w jednym wpisie localStorage. To byłoby bardzo nieefektywne - całość musiałaby być parsowana i ponownie zakodowana za każdym razem, gdy niektóre drobne zmiany szczegółów. Ponadto, JSON nie może obsłużyć wielu odsyłaczy wewnątrz struktury obiektu i usuwa wiele szczegółów, np. konstruktor, nie-numeryczne właściwości tablic, co znajduje się w rzadkim wpisie, itp.

Zamiast tego możesz użyć http://rhaboo.org . przechowuje duże obiekty korzystanie z wielu wpisów localStorage, dzięki czemu można szybko wprowadzać małe zmiany. Przywrócone obiekty są o wiele dokładniejszymi kopiami zapisanych, a API jest niezwykle proste. Np.:

var store = Rhaboo.persistent('Some name');
store.write('count', store.count ? store.count+1 : 1);
store.write('somethingfancy', {
  one: ['man', 'went'],
  2: 'mow',
  went: [  2, { mow: ['a', 'meadow' ] }, {}  ]
});
store.somethingfancy.went[1].mow.write(1, 'lawn');

BTW, ja to napisałem.

 13
Author: Adrian May,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-01 11:32:00

Przeglądarki Mobilne:

Browser    | Chrome    | Android Browser    | Firefox     | iOS Safari
Version    | 40        | 4.3                | 34          | 6-8
Available  | 10MB      | 2MB                | 10MB        | 5MB

Przeglądarki desktopowe:

Browser    | Chrome   | Opera    | Firefox    | Safari      | IE
Version    | 40       | 27       | 34         | 6-8         | 9-11
Available  | 10MB     | 10MB     | 10MB       | 5MB         | 10MB
 13
Author: Behnam Mohammadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-18 11:38:27

Bardzo mi się podoba odpowiedź cdmckaya , ale nie wygląda dobrze sprawdzanie rozmiaru w czasie rzeczywistym: jest po prostu za wolno (dla mnie 2 sekundy). Jest to ulepszona wersja, która jest znacznie szybsza i dokładniejsza, również z opcją wyboru, jak duży może być błąd (domyślnie 250,000, im mniejszy błąd - tym dłuższe jest obliczenie):

function getLocalStorageMaxSize(error) {
  if (localStorage) {
    var max = 10 * 1024 * 1024,
        i = 64,
        string1024 = '',
        string = '',
        // generate a random key
        testKey = 'size-test-' + Math.random().toString(),
        minimalFound = 0,
        error = error || 25e4;

    // fill a string with 1024 symbols / bytes    
    while (i--) string1024 += 1e16;

    i = max / 1024;

    // fill a string with 'max' amount of symbols / bytes    
    while (i--) string += string1024;

    i = max;

    // binary search implementation
    while (i > 1) {
      try {
        localStorage.setItem(testKey, string.substr(0, i));
        localStorage.removeItem(testKey);

        if (minimalFound < i - error) {
          minimalFound = i;
          i = i * 1.5;
        }
        else break;
      } catch (e) {
        localStorage.removeItem(testKey);
        i = minimalFound + (i - minimalFound) / 2;
      }
    }

    return minimalFound;
  }
}

Do testu:

console.log(getLocalStorageMaxSize()); // takes .3s
console.log(getLocalStorageMaxSize(.1)); // takes 2s, but way more exact

To działa znacznie szybciej dla błędu standardowego; również może być znacznie dokładniejsze, gdy konieczne.

 6
Author: smnbbrv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:39

Możesz użyć następującego kodu w nowoczesnych przeglądarkach, aby sprawnie sprawdzić limit pamięci (całkowity i użyty ) w czasie rzeczywistym:

if ('storage' in navigator && 'estimate' in navigator.storage) {
        navigator.storage.estimate()
            .then(estimate => {
                console.log("Usage (in Bytes): ", estimate.usage,
                            ",  Total Quota (in Bytes): ", estimate.quota);
            });
}
 4
Author: abhiweb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-29 08:12:56

Robię co następuje:

getLocalStorageSizeLimit = function () {

    var maxLength = Math.pow(2,24);
    var preLength = 0;
    var hugeString = "0";
    var testString;
    var keyName = "testingLengthKey";

    //2^24 = 16777216 should be enough to all browsers
    testString = (new Array(Math.pow(2, 24))).join("X");

    while (maxLength !== preLength) {
        try  {
            localStorage.setItem(keyName, testString);

            preLength = testString.length;
            maxLength = Math.ceil(preLength + ((hugeString.length - preLength) / 2));

            testString = hugeString.substr(0, maxLength);
        } catch (e) {
            hugeString = testString;

            maxLength = Math.floor(testString.length - (testString.length - preLength) / 2);
            testString = hugeString.substr(0, maxLength);
        }
    }

    localStorage.removeItem(keyName);

    maxLength = JSON.stringify(this.storageObject).length + maxLength + keyName.length - 2;

    return maxLength;
};
 3
Author: Itay Merchav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-17 00:01:43