2011-09-23 1 views
10

J'ai une liste avec 10.000 entrys.La meilleure façon de stocker une liste énorme avec des hachages en Javascript

par exemple

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

Je n'utiliser un tableau (0,1,2,3) parce que je peux vérifier très rapide
-> si ce hachage existe ou non.

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

Mais je ne suis pas sûr, est-ce une bonne solution?
Est-ce que c'est peut-être un problème de gérer un objet avec 10.000 entrées?

EDIT:
J'essaie de construire un lecteur de flux rss qui montre que de nouveaux flux. Donc je calcule un hash à partir du lien (chaque nouvelle a un lien uniqe) et le stocke dans l'objet (mongoDB). BTW: 10.000 entrys n'est pas le cas normal (mais il est possible)

+0

Veuillez nous dire ce que vous essayez d'accomplir, car cela façonnera le genre de suggestions que vous obtiendrez. –

Répondre

3

Mon conseil:

  1. Utilisation en tant que petit d'un hachage possible pour la tâche à accomplir. Si vous traitez avec des centaines de chaînes de caractères, par rapport à des milliards, votre longueur de hachage peut être relativement petite.
  2. Stockez le hachage sous la forme d'un nombre entier, et non d'une chaîne, afin d'éviter qu'il ne prenne moins de place que nécessaire.
  3. Ne pas stocker en tant qu'objets, il suffit de les stocker dans un arbre binaire simple log2 (keySize) profonde.

D'autres idées:

  1. Pouvez-vous venir à cela avec une approche hybride? Utilisez des hachages pour les aliments récents de moins d'un mois, et ne vous souciez pas de montrer des objets de plus d'un mois. Conservez le hachage et la date ensemble, et nettoyez les vieux hachages chaque jour?
+0

Je ne peux pas enregistrer "binary tree logs" dans le MongoDb mais vos pensées sont intéressantes. Je dois (repartir tout seul) et y penser en paix et en silence. – Peter

3

Vous pouvez utiliser l'opérateur in:

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

Cependant, ce sera également de retour true pour les membres qui sont dans la chaîne prototype d'objets:

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

Pour résoudre ce problème, vous pouvez utiliser à la place hasOwnProperty:

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

Même si vous n'avez pas ajouté de méthodes à Object.prototype, vous ne pouvez pas garantir que les autres bibliothèques tierces que vous utilisez ne le sont pas; Incidemment, étendre Object.prototype est mal vu, donc vous ne devriez pas vraiment le faire. Pourquoi?; parce que vous ne devriez pas modifier les choses que vous ne possédez pas.

2

10.000 est pas mal. Vous pouvez envisager de stocker les hachages dans une base de données et l'interroger en utilisant ajax. Cela peut prendre un peu plus de temps pour interroger un hachage, mais votre page se charge beaucoup plus rapidement.

+1

+1. Le ** problème ** ici ne sera pas stocker les 10 000 objets dans un objet, le problème sera la *** taille *** de la page contenant les 10 000 objets, et le temps nécessaire pour les transférer. – Matt

+0

peut-être que les hashcodes seront générés du côté client et n'auront pas besoin d'être transférés. –

0

Ce n'est pas un problème dans le navigateur moderne sur les ordinateurs modernes de quelque façon que ce soit.10k entrées qui prennent 50 octets chacun prendraient encore moins de 500 Ko de RAM.

Tant que le js est servi gzippé, la bande passante n'est pas un problème - mais essayez de servir les données le plus tard possible afin qu'elles ne bloquent pas les performances de pageload perçues.

Dans l'ensemble, sauf si vous souhaitez répondre aux téléphones portables, alors votre solution est correcte.

+0

Mais s'il y a une meilleure façon d'être plus efficace, cela ne pourrait pas faire de mal. –

+0

Vrai, et la solution peut certainement être optimisée un peu. Cependant, l'approche en elle-même est correcte, et il n'y a aucun problème pour un navigateur moderne pour gérer les propriétés 10k sur un objet. –

Questions connexes