2011-09-23 9 views
10

Ho una lista con 10.000 entrys.Il modo migliore per memorizzare una lista enorme con hash in Javascript

ad esempio

myList = {}; 
myList[hashjh5j4h5j4h5j4] 
myList[hashs54s5d4s5d4sd] 
myList[hash5as465d45ad4d] 
.... 

io non utilizzare un array (0,1,2,3), perché posso controllare molto veloce
-> se questo hash esiste o non.

if(typeof myObject[hashjh5j4h5j4h5j4] == 'undefined') 
{ 
    alert('it is new'); 
} 
else 
{ 
    alert('old stuff'); 
} 

Ma non sono sicuro, è una buona soluzione?
È forse un problema gestire un oggetto con 10.000 voci?

EDIT:
provo ad installare un lettore di feed RSS che mostra solo i nuovi feed. Quindi calcolo un hash dal link (ogni news ha un link uniqe) e lo memorizza nell'oggetto (mongoDB). BTW: 10.000 entrys non è il caso normale (ma è possibile)

+0

Per favore dicci cosa stai cercando di realizzare, in quanto modellerà il tipo di suggerimenti che ottieni. –

risposta

3

Il mio consiglio:

  1. Uso come piccolo di un hash più possibile per il compito a portata di mano. Se hai a che fare con centinaia di stringhe lavabili, rispetto a miliardi, la tua lunghezza di hash può essere relativamente piccola.
  2. Memorizza l'hash come un numero intero, non una stringa, per evitare di occupare meno spazio del necessario.
  3. Non archiviare come oggetti, è sufficiente archiviarli in un semplice albero binario log2 (keySize) profondo.

Ulteriori pensieri:

  1. puoi venire a questo con un approccio ibrido? Usa gli hash per i feed recenti meno di un mese e non preoccuparti di mostrare oggetti più vecchi di un mese. Conservare insieme l'hash e la data e ripulire gli hash vecchi ogni giorno?
+0

Non posso salvare i "log binari" in MongoDb ma i tuoi ulteriori pensieri sono interessanti. Devo (andare via da solo e) pensare a ciò in pace e tranquillità. – Peter

3

È possibile utilizzare l'in dell'operatore:

if ('hashjh5j4h5j4h5j4' in myList) { .. } 

Tuttavia, questo sarà anche restituire true per i membri che si trovano nella catena oggetti prototipi:

Object.prototype.foo = function() {}; 
if ("foo" in myList) { /* will be true */ }; 

Per risolvere questo problema, è possibile utilizzare hasOwnProperty invece:

if (myList.hasOwnProperty('hashjh5j4h5j4h5j4')) { .. } 

Anche se non è possibile aggiungere metodi a Object.prototype, non è possibile garantire che altre librerie di terze parti utilizzate non lo siano; Per inciso, estendere Object.prototype è disapprovato, quindi non dovresti farlo davvero. Perché?; perché non dovresti modificare le cose che non possiedi.

2

10.000 è un bel po '. Puoi considerare di archiviare gli hash in un database e interrogarlo usando ajax. Forse richiede un po 'più tempo per interrogare un hash ma la tua pagina si carica molto più velocemente.

+1

+1. Il ** problema ** qui non memorizzerà i 10.000 oggetti in un oggetto, il problema sarà la dimensione *** *** della pagina che contiene i 10.000 oggetti e il tempo impiegato per trasferirli. – Matt

+0

forse gli hashcode generano sul lato client e non devono essere trasferiti. –

0

Non è un problema nei browser moderni sui computer moderni in alcun modo.

Le voci 10k che occupano 50 byte ciascuna richiederebbero meno di 500 KB di RAM.

Fintantoché il servizio js viene servito con gzip, la larghezza di banda non è un problema, ma cercate di servire i dati il ​​più tardi possibile in modo che non blocchino le prestazioni di pageload percepite.

Tutto sommato, a meno che non si desideri soddisfare i telefoni cellulari, quindi la soluzione va bene.

+0

Ma se c'è un modo migliore per essere più efficienti, non potrebbe far male. –

+0

Vero, e la soluzione può certamente essere ottimizzata un po '. Tuttavia l'approccio di per sé va bene, e non c'è alcun problema per un browser moderno per gestire le proprietà 10k su un oggetto. –

Problemi correlati