689 votes

Quelle est la taille maximale des valeurs de localStorage ?

Desde localStorage ne prend (actuellement) en charge que les chaînes de caractères comme valeurs, et pour ce faire, les objets doivent être stringifiés (stockés en tant que chaîne JSON) avant de pouvoir être stockés. Existe-t-il une limitation définie concernant la longueur des valeurs ?

Quelqu'un sait-il s'il existe une définition qui s'applique à tous les navigateurs ?

27 votes

Je pense que personne n'a vraiment répondu à la question de la "longueur maximale par valeur".

2 votes

@PeteAlvin Je viens juste a répondu à la question .

6 votes

503voto

Daniel Vassallo Points 142049

Citant le Article de Wikipédia sur le stockage sur le Web :

Le stockage sur le web peut être considéré de manière simpliste comme une amélioration des cookies, offrant une capacité de stockage beaucoup plus importante ( 10 Mo par origine dans Google Chrome( https://plus.google.com/u/0/+FrancoisBeaufort/posts/S5Q9HqDB8bh ), Mozilla Firefox et Opera ; 10 Mo par zone de stockage dans Internet Explorer ) et de meilleures interfaces programmatiques.

Et citant également un Article de John Resig [affiché en janvier 2007] :

Espace de stockage

Il est sous-entendu que, avec DOM Storage, vous disposez de beaucoup plus d'espace de stockage que l'agent utilisateur typique imposées aux cookies. Cependant, la quantité qui est fournie n'est pas définie dans la spécification, et elle n'est pas non plus diffusée de manière significative par l'agent utilisateur.

Si vous regardez le code source de Mozilla nous pouvons voir que 5120KB est la taille de stockage par défaut de stockage par défaut pour un domaine entier. Cela vous donne beaucoup plus d'espace pour travailler qu'un cookie typique de 2KB typique.

Cependant, la taille de cette zone de stockage peut être personnalisée par l'utilisateur (ainsi, une zone de stockage de 5 Mo n'est pas garantie, et n'est pas non plus implicite) et l'agent utilisateur (Opera, par exemple, peut ne fournir que 3MB - mais seul le temps nous le dira).

0 votes

Je n'ai pas compris le per origin un peu ? Si un site web foo.com a 200 utilisateurs, sera-t-elle de 5 Mo pour tous ces 200 utilisateurs qui surfent sur cette page ?

34 votes

@Cupidvogel non, ça veut dire chaque domain ( origin ) peut stocker 5MB sur un client individuel. Les données sont stockées sur l'ordinateur du client. localStorage interagissent entre les clients.

2 votes

Juste une question bête, par domaine vous voulez vraiment dire domaine, non ? Donc foo.com y foo.com/boo.html pointeront tous deux vers le même domaine et le localstorage sera celui combiné pour ces deux pages pour le domaine foo.com n'est-ce pas ?

161voto

user267780 Points 581

En fait, Opera n'a pas de limite de 5MB. Il propose d'augmenter cette limite en fonction des besoins des applications. L'utilisateur peut même choisir "Stockage illimité" pour un domaine.

Vous pouvez facilement test des limites/quotas de localStorage vous-même.

56 votes

Ne fait plus planter Chrome... Point intéressant : 5MB est égal à 2,5 millions de caractères sur Chrome. Donc apparemment, UFT16 est utilisé pour localStore.

1 votes

@FelixAlcala Malheureusement, il plante Chrome 15.0.874.54 beta sur Mac OS X. J'ai eu un plantage à 1.500.000 caractères.

0 votes

Il a fait planter chrome sur mon appareil, et a également réinitialisé le fond d'écran, ce qui n'est pas surprenant, mon téléphone a si peu de RAM qu'il ne peut pas gérer l'ouverture d'une stupide application d'éclairage pendant que chrome est ouvert.

104voto

cdmckay Points 11234

Voici un script simple pour connaître la limite :

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

Voici l'essentiel , JSFiddle y article de blog .

Le script va tester des chaînes de texte de plus en plus grandes jusqu'à ce que le navigateur lève une exception. À ce moment-là, il effacera les données de test et définira une clé de taille dans localStorage stockant la taille en kilo-octets.

1 votes

Une solution intéressante. J'ai trouvé ce commentaire Qu'en pensez-vous ?

2 votes

@brasofilo Je pense que cette ligne suppose que vous avez 5MB et soustrait ensuite la quantité utilisée.

0 votes

Ooook, bien sûr. Le problème que j'ai avec votre code est que je n'arrive pas à obtenir des résultats corrects avec Méthode correcte pour convertir la taille en octets en KB, MB, GB en Javascript ... Je réviserai ça demain mais si vous pouvez y jeter un coup d'œil, j'apprécierais.

28voto

tagawa Points 1930

Ne partez pas du principe que 5 Mo sont disponibles - localLa capacité de stockage varie selon le navigateur, les valeurs les plus courantes étant 2,5 Mo, 5 Mo et illimité. Source : http://dev-test.nemikor.com/web-storage/support-test/

18voto

Adrian May Points 497

Il n'est pas souhaitable de regrouper des objets volumineux dans une seule entrée localStorage. Ce serait très inefficace : il faudrait analyser et ré-encoder l'ensemble à chaque fois qu'un petit détail change. De plus, JSON ne peut pas gérer les références croisées multiples au sein d'une structure d'objet et efface de nombreux détails, par exemple le constructeur, les propriétés non numériques des tableaux, le contenu d'une entrée éparse, etc.

Au lieu de cela, vous pouvez utiliser Rhaboo . Il stocke les objets de grande taille en utilisant de nombreuses entrées localStorage afin que vous puissiez effectuer rapidement de petites modifications. Les objets restaurés sont des copies beaucoup plus précises des objets sauvegardés et l'API est incroyablement simple. Par exemple :

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, je l'ai écrit.

1 votes

Merci Martin. Vous pouvez également consulter mon dépôt 'evon'. Ce n'est qu'un sérialiseur pour l'instant et l'encre est très humide, mais il est plus rapide que rhaboo et tout aussi polyvalent. Rhaboo sera bientôt converti pour l'utiliser en interne.

14 votes

Utile mais je ne pense pas que cela réponde à la question " Quelle est la taille maximale de localStorage ? " Votre réponse pourrait être améliorée en indiquant ce qui se passe lorsque cette bibliothèque tente de stocker quelque chose au-delà de la taille limite, et comment y réagir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X