2015-04-29 23 views
9

Diciamo di aver creato una chiave di memorizzazione locale e di dargli una stringa vuota. Il nome del keyitem occupa la stessa quantità di spazio del valore per carattere?Quanto spazio occupa la chiave localstorage?

per esempio fa

localStorage.setItem("keyitem","") 
//Equal the space of this other one under? 
localStorage.setItem("key","item"); 

Inoltre, non la quantità di chiavi importa? per esempio

localStorage.setItem("key",""); 
//Equal the amount of storage as the 3 under combined? 
localStorage.setItem("k",""); 
localStorage.setItem("o",""); 
localStorage.setItem("h",""); 
+0

La quantità di chiavi è praticamente binaria - '0' o' 1'.Non è possibile avere più chiavi con lo stesso nome, più chiamate a "setItem" sovrascrivono solo il valore precedente. – Bergi

+5

Questo è specifico del browser poiché ciascun browser memorizza i dati in modo diverso, ad es. Chrome/firefox credo utilizzi sqlite dbs, opera xml files –

+0

Ricorda che questo è probabilmente solo ciò che il browser vuole fare con esso. Immagino che memorizzerebbe stringhe a 16 o 32 bit come chiave e valore. Ma non sono sicuro. (Quello che il browser vuole fare è: lo implementano in modo diverso, probs) –

risposta

2

ho trovato una funzione una volta per calcolare la dimensione dei localStorage e sessionStorage oggetti, ma non riesco a ricordare dove l'ho trovato.

Ecco il codice:

Storage.prototype.size = function(units) { 
    'use strict'; 
    units = units ? units.toUpperCase() : 'MB'; 
    var size = unescape(encodeURIComponent(JSON.stringify(this))).length; 
    switch (units) { 
     case 'B': return [size,'B'].join(' '); 
     case 'KB': return [+(size/1024).toFixed(3),'KB'].join(' '); 
     default: return [+(size/1024/1024).toFixed(3),'MB'].join(' '); 
    } 
}; 

ho deciso di andare avanti e di eseguire alcuni test in vari browser.

Firefox (37.0.2):

Firefox console output

Chrome (42.0.2311.90 m):

Chrome console output

IE 11 (11.0.9600.17420):

IE Console Output

Opera (29.0.1795.47):

Opera console output

così sembra FireFox, Chro io e Opera (probabilmente anche Safari, ma non ce l'ho) hanno tutti lo stesso comportamento e le chiavi occupano molto più spazio dei loro valori.

In IE (buon vecchio IE ...), l'implementazione viene eseguita in modo tale che non importa come si memorizza qualcosa.

+0

Citerò un commento su una risposta successiva: "Questo non mostra quanto spazio occupa la chiave effettiva .Questo mostra solo la quantità di caratteri che ha una rappresentazione JSON di localStorage.Ogni browser implementa il proprio modo di salvare dati. Ognuno di questi metodi può memorizzare i dati in modo completamente diverso dall'altro, ad esempio uno può usare la codifica utf8 mentre l'altro può usare utf16 (che significa l'uso di 2 byte per rappresentare 1 carattere), alcuni possono usare la compressione, ecc. Patrick Evans ". Questo vale anche per il tuo metodo: devi solo misurare la stringa JSON. (ctd) – Scimonster

+0

(ctd) E l'implementazione di IE non sembra molto diversa da qui. Il problema è con la chiave 'key' - nella maggior parte delle implementazioni, che non include la rappresentazione JSON. Apparentemente IE lo include in questo caso. Pertanto, stai ricevendo il JSON '{" keyitem ":" "}' che è 14 byte per il primo e '{}' per il secondo. In IE, è "{" key ":" item "}' per il secondo. Quindi non puoi davvero dirlo da qui. -1 – Scimonster

+0

@Scimonster E citerò una risposta al commento che hai citato: "Sono d'accordo, ma è il miglior proxy per capire cosa viene memorizzato nel localStorage - Jaco de Groot" – RevanProdigalKnight

0

è possibile determinare da soli utilizzando il JSON stringify metodi per trasformare l'oggetto localStorage in un oggetto JSON:

JSON.stringify(localStorage).length 

Questo non restituirà la dimensione effettiva della chiave come dati può essere memorizzato come utf16 (2 byte) o utf8 (1 byte), ma è un buon proxy per la dimensione effettiva. Vedi un frammento di codice qui sotto:

localStorage.clear() 
localStorage.setItem("keyitem","") 
document.write(JSON.stringify(localStorage).length+'</br>') 

//Equal the space of this other one under? 
localStorage.setItem("key","item"); 
document.write(JSON.stringify(localStorage).length+'</br>') 

localStorage.clear(); 
localStorage.setItem("key",""); 
document.write(JSON.stringify(localStorage).length+'</br>') 


//Equal the amount of storage as the 3 under combined? 
localStorage.setItem("k",""); 
localStorage.setItem("o",""); 
localStorage.setItem("h",""); 
document.write(JSON.stringify(localStorage).length+'</br>') 
+0

Quindi stai dicendo che tutti i browser lo memorizzano come una stringa JSON? Immagino che questo abbia senso dato che è JavaScript Notation, ma come lo sai? Sono interessato –

+2

Qual è la tua risposta? Non ho idea di cosa hai determinato nel tuo jsFiddle, e jsFiddle non mi sta caricando proprio ora. Questo è il motivo per cui mettiamo tutti i dettagli importanti direttamente qui invece che su qualche altro sito schifoso. –

+0

Le mie scuse, questo snippet di codice non funziona su StackOverflow stesso. – Jaco

1

Il nome della voce KEYper occupano la stessa quantità di spazio come valore farebbe per carattere?

No, non è necessario. La quantità di spazio occupato dalla chiave potrebbe essere maggiore della quantità di spazio preso in base al valore. Ma insieme lo spazio occupato dalla chiave e il valore dovrebbe essere di circa 5 MB (anche se questo si differenzia con il browser in quanto è il browser dipendente)

È possibile utilizzare questo codice per verificare:

localStorage.clear(); 
localStorage.setItem(new Array(5e6).join(' '),''); 
localStorage.key(0).length; 

Uscita su Chrome per la prova di cui sopra:

enter image description here

Quindi, fintanto che esso comes under 5MB (which is mostly the upper limit for most browsers) la chiave può avere qualsiasi lunghezza

+0

Anche per menzionare che 5 MB sono pari a 2,5 milioni di caratteri su Chrome. Anche questo: http://stackoverflow.com/questions/11333807/does-html5-localstorage-maximum-size-include-key-names/11333871#11333871 –

+0

@Rahil Tripathi In questo caso, direi che 5MB è uguale a 2,5 milioni localStorage.setItem ("h", ""); che contiene anche solo un personaggio? – mattias

+0

@mattias: - No, questo è il limite superiore (* anche questo è specifico per i browser *). Puoi eseguire il test che ho aggiunto nel tuo browser (* In firefox sta facendo circa 2.94 MB per me *) e otterrai lo spazio che la tua chiave sta prendendo. Nel caso in cui si utilizza la chiave come 'k', allora non è 5 MB. Ha senso ora? –

0

Direi che questo è un dettaglio di implementazione per ciò che riguarda la reale struttura della memoria su disco.

In pratica viene assegnata una certa quantità di spazio per origine (solitamente 5MiB, per verificare lo spazio di archiviazione effettivo è possibile utilizzare questo test tool collegato nei documenti MDN) ed è possibile memorizzare i dati (sia in termini di chiavi che di valori) a condizione che non superi quella dimensione, come mostrato in una risposta precedente. Quindi sì lo keys are included in the storage quota.

Come indicato nello strumento di test che ho incluso, i caratteri sono in realtà UTF-16 in modo che occupino 2 byte della quota di archiviazione.

Si noti inoltre che la memoria memorizza le stringhe, questo significa che se si inserisce un float grande come chiave o valore non lo si memorizza nel suo formato binario ma come stringhe!

// These takes up the same space 
localStorage.setItem("a", 123); 
localStorage.setItem("a", "123"); 

Infatti se si tenta di fare typeof delle seguenti si ottiene string in entrambi i casi

localStorage.setItem("123", ""); 
localStorage.setItem(123, ""); 
typeof localStorage.key(0); // returns "string" 
typeof localStorage.key(1); // returns "string" as well 

Per quanto riguarda la seconda parte, in termini di stoccaggio questo

localStorage.setItem("k",""); 
localStorage.setItem("o",""); 
localStorage.setItem("h",""); 

dovrebbe prendi 3 caratteri di memoria dalla tua quota, ovvero 3 * 2 byte se usi UTF-16 o 3 byte se usi UTF-8.

Per una panoramica delle soluzioni di storage locale è possibile controllare qui http://www.html5rocks.com/en/features/storage

0

Ho eseguito un test in Chrome ed è stato in grado di dimostrare che la chiave occupa esattamente lo spazio della lunghezza.

Con una chiave di abc, sono stato in grado di impostare un valore di lunghezza 5242877. Con una chiave di a, sono stato in grado di impostare un valore di lunghezza 5242879. Come si può vedere, rimuovendo i caratteri dalla chiave liberato quelli 2 per il valore.

+0

ok bene! che dire "se ci sono 2,5 milioni (ad esempio) di chiavi di localizzazione diverse con un solo carattere come keyname, sarebbe uguale a una chiave con un keyname di 2,5 milioni di caratteri nello spazio?" – mattias

+0

Sì, sembra proprio questo. – Scimonster

Problemi correlati