84 votes

Calcul de l'utilisation de l'espace de stockage local

Je crée une application en utilisant l'éditeur Bespin et le localStorage de HTML5. Il stocke tous les fichiers localement et aide à la grammaire, utilise JSLint et d'autres analyseurs pour CSS et HTML pour aider l'utilisateur.

Je veux calculer combien de la limite de localStorage a été utilisée et combien il en reste réellement. Est-ce possible aujourd'hui ? Je pensais pour ne pas simplement calculer les bits qui sont stockés. Mais là encore, je ne sais pas ce qu'il y a de plus que je ne peux pas mesurer moi-même.

0 votes

0 votes

JavaScript / HTML5 localStorage fonctions utiles : stackoverflow.com/q/34245593/4339170

0 votes

74voto

Morgon Points 1655

Vous pouvez vous faire une idée approximative en utilisant les méthodes JSON pour transformer l'objet localStorage entier en une chaîne JSON :

JSON.stringify(localStorage).length

Je ne sais pas dans quelle mesure cela serait précis en termes d'octets, surtout avec les quelques octets de balisage supplémentaires si vous utilisez des objets additionnels - mais je pense que c'est mieux que de penser que vous ne faites que 28K et que vous faites 280K (ou vice-versa).

4 votes

C'est assez précis pour qu'on puisse travailler avec. Avec localStorage au maximum sur Chrome 14, JSON.stringify(localStorage).length === 2636625 ou 2,51448 Mo, ce qui est assez proche ( dev-test.nemikor.com/web-storage/support-test ). Utilisé en tandem avec le try{} catch{}, et vous en avez assez pour construire une classe d'aide.

13 votes

Notez que, comme indiqué dans le test dont vous donnez le lien, il s'agit d'une taille en caractères et non en octets : "Les chaînes de caractères en JavaScript sont UTF-16, donc chaque caractère nécessite deux octets de mémoire. Cela signifie que, alors que de nombreux navigateurs ont une limite de 5 Mo, vous ne pouvez stocker que 2,5 M de caractères."

60voto

JeroenEijkhof Points 1071

Je n'ai pas trouvé de moyen universel d'obtenir la limite restante sur les navigateurs dont j'avais besoin, mais j'ai découvert que lorsque vous atteignez la limite, un message d'erreur s'affiche. Ce message est bien sûr différent dans chaque navigateur.

Pour le maximiser, j'ai utilisé ce petit script :

for (var i = 0, data = "m"; i < 40; i++) {
    try { 
        localStorage.setItem("DATA", data);
        data = data + data;
    } catch(e) {
        var storageSize = Math.round(JSON.stringify(localStorage).length / 1024);
        console.log("LIMIT REACHED: (" + i + ") " + storageSize + "K");
        console.log(e);
        break;
    }
}
localStorage.removeItem("DATA");

J'en ai tiré cette information :

Google Chrome

  • DOMException :
    • code : 22
    • message : "Impossible d'exécuter 'setItem' sur 'Storage' : La définition de la valeur de 'data' a dépassé le quota."
    • Nom : "QuotaExceededError".

Mozilla Firefox

  • DOMException :
    • code : 1014
    • message : "La taille maximale du stockage persistant est atteinte"
    • nom : "NS_ERROR_DOM_QUOTA_REACHED".

Safari

  • DOMException :
    • code : 22
    • message : "QuotaExceededError : DOM Exception 22"
    • Nom : "QuotaExceededError".

Internet Explorer, Edge (communauté)

  • DOMException :
    • code : 22
    • message : "QuotaExceededError"
    • Nom : "QuotaExceededError".

Ma solution

Pour l'instant, ma solution consiste à ajouter un appel supplémentaire chaque fois que l'utilisateur veut enregistrer quelque chose. Et si l'exception est attrapée, je lui dirais qu'il n'a plus de capacité de stockage.


Editer : Supprimer les données ajoutées

J'ai oublié de mentionner que pour que cela fonctionne réellement, vous devez supprimer le fichier DATA l'élément qui a été défini à l'origine. Le changement est reflété ci-dessus par l'utilisation de l'option removeItem() fonction.

0 votes

Très bien, quelle était la valeur de i quand cela a été atteint dans chaque cas ?

0 votes

20-21 je pense. Vous pouvez effectuer le test vous-même si vous le souhaitez.

0 votes

IE : ABORT_ERR : 20 code : 22 message : "QuotaExceededError" name : "QuotaExceededError"

26voto

Daniel Vassallo Points 142049

IE8 met en œuvre le remainingSpace à cette fin :

alert(window.localStorage.remainingSpace);  // should return 5000000 when empty

Malheureusement, il semble que cela ne soit pas disponible dans les autres navigateurs. Cependant, je ne suis pas sûr qu'ils mettent en œuvre quelque chose de similaire.

1 votes

@WmasterJ : Je vois que l'équipe IE a effectivement proposé d'inclure ce point (ou quelque chose de similaire) dans la norme (en 2008) : markmail.org/thread/ugzdcamtyftcyk6y .

45 votes

Cette fois, IE avait raison. Il semble évident que cela est nécessaire.

0 votes

Je ne comprends pas, Microsoft dit : "L'attribut localStorage fournit des zones de stockage persistantes pour les domaines. Il permet aux applications Web de stocker près de 10 Mo de données utilisateur, comme des documents entiers ou la boîte aux lettres d'un utilisateur, sur le client pour des raisons de performances." mais à la fin, remainingSpace renvoie 5000000 ( ?!?!) pourquoi ?!

16voto

jas- Points 437

Vous pouvez utiliser la ligne ci-dessous pour calculer précisément cette valeur et voici un jsfiddle pour illustrer son utilisation

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

0 votes

J'utilise cet algorithme pour déterminer l'espace utilisé pour une extension chrome, mais je me souviens avoir lu une autre question de SO (j'ai oublié laquelle, maintenant) que JS utilise des chaînes UTF-16 au lieu d'UTF-8, et en tant que tel, vous devez doubler le nombre d'octets que vous obtenez en faisant string.length. Savez-vous si c'est vrai ? Si oui, je vais devoir mettre à jour mon code...

1 votes

Votre jsfiddle ne se charge pas dans mon navigateur (mac/chrome).

0 votes

Il semble que vous ayez cassé JSFiddle, bien que vous puissiez toujours voir le résultat. aquí ¡!

9voto

Shiboe Points 121

J'ai rencontré ce problème aujourd'hui lors d'un test (dépassement du quota de stockage) et j'ai trouvé une solution. IMO, savoir quelle est la limite et où nous nous situons par rapport à elle est beaucoup moins utile que de mettre en œuvre un moyen fonctionnel de continuer à stocker au-delà du quota.

Ainsi, plutôt que d'essayer de faire des comparaisons de taille et des contrôles de capacité, réagissons lorsque nous avons atteint le quota, réduisons notre stockage actuel d'un tiers et reprenons le stockage. Si cette réduction échoue, arrêtons de stocker.

set: function( param, val ) { 
    try{
        localStorage.setItem( param, typeof value == 'object' ? JSON.stringify(value) : value )
        localStorage.setItem( 'lastStore', new Date().getTime() )
    }
    catch(e){
      if( e.code === 22 ){
        // we've hit our local storage limit! lets remove 1/3rd of the entries (hopefully chronologically)
        // and try again... If we fail to remove entries, lets silently give up
        console.log('Local storage capacity reached.')

        var maxLength = localStorage.length
          , reduceBy = ~~(maxLength / 3);

        for( var i = 0; i < reduceBy; i++ ){
          if( localStorage.key(0) ){
            localStorage.removeItem( localStorage.key(0) );
          }
          else break;
        }

        if( localStorage.length < maxLength ){
          console.log('Cache data reduced to fit new entries. (' + maxLength + ' => ' + localStorage.length + ')');
          public.set( param, value );
        }
        else {
          console.log('Could not reduce cache size. Removing session cache setting from this instance.');
          public.set = function(){}
        }
      }
    }
}

Cette fonction se trouve dans un objet enveloppant, donc public.set s'appelle simplement lui-même. Maintenant, nous pouvons ajouter du stockage sans nous soucier du quota ou de la proximité de celui-ci. Si un seul magasin dépasse un tiers de la taille du quota, cette fonction arrêtera le tri et le stockage, et à ce stade, vous ne devriez pas mettre en cache de toute façon, n'est-ce pas ?

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