2011-09-23 7 views
10

Tengo una lista con 10.000 entrys.La mejor manera de almacenar una gran lista con hash en Javascript

por ejemplo

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

yo no utilizar una matriz (0,1,2,3) porque puedo comprobar muy rápido
-> si este hash existe o no.

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

Pero no estoy seguro, ¿es esta una buena solución?
¿Es quizás un problema manejar un objeto con 10.000 entradas?

EDIT:
trato de construir un lector de feeds RSS que muestra sólo los nuevos alimentos. Así que calculo un hash del enlace (cada noticia tiene un enlace único) y lo almaceno en el objeto (mongoDB). Por cierto: 10.000 entrada disponible no es el caso normal (pero es posible)

+0

Cuéntanos qué intentas lograr, ya que dará forma al tipo de sugerencias que recibas. –

Respuesta

3

Mi consejo:

  1. uso tan pequeño de un hash como sea posible para la tarea en cuestión. Si se trata de cientos de cadenas procesables, en comparación con miles de millones, entonces la longitud de hash puede ser relativamente pequeña.
  2. Almacena el hash como un entero, no como una cadena, para evitar que ocupe menos espacio de lo necesario.
  3. No almacenar como objetos, simplemente guárdelos en un árbol binario simple log2 (keySize) de profundidad.

pensamientos adicionales:

  1. ¿puedes venir a esto con un enfoque híbrido? Use hashes para feeds recientes de menos de un mes de antigüedad y no se moleste en mostrar elementos de más de un mes de antigüedad. Guarde el hash y la fecha juntos, y limpie hashes viejos todos los días?
+0

No puedo guardar "registros de árbol binario" en el MongoDb pero sus pensamientos adicionales son interesantes. Debo (irme por mi cuenta y) pensar en eso en paz y tranquilidad. – Peter

3

se puede utilizar el in operador:

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

Sin embargo, esto también volverá true para los miembros que se encuentran en la cadena de objetos prototipo:

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

Para solucionar esto, se podía utilizar en lugar hasOwnProperty:

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

Si bien usted mismo puede no haber agregado métodos al Object.prototype, no puede garantizar que otras bibliotecas de terceros que use no lo hayan hecho; por cierto, extender Object.prototype está mal visto, así que no deberías hacerlo. ¿Por qué?; porque no deberías modificar cosas que no te pertenecen.

2

10.000 es bastante. Puede considerar almacenar los hashes en una base de datos y consultarlos usando ajax. Puede llevar un poco más de tiempo consultar un hash pero tu página se carga mucho más rápido.

+1

+1. El ** problema ** aquí no almacenará los 10,000 objetos en un Objeto, el problema será *** el tamaño *** de la página que contiene los 10,000 objetos, y el tiempo necesario para transferirlos. – Matt

+0

tal vez los códigos hash se generarán en el lado del cliente y no será necesario transferirlos. –

0

No es un problema en el navegador moderno en las computadoras modernas de ninguna manera.

10k Las entradas que ocupan 50 bytes cada una aún ocupan menos de 500 KB de ram.

Siempre que la js se sirva gzip, el ancho de banda no es un problema, pero intente publicar los datos lo más tarde posible para que no bloqueen el rendimiento percibido de la carga de la página.

Con todo, a menos que desee atender a los teléfonos celulares, entonces su solución está bien.

+0

Pero si hay una mejor manera de ser más eficiente, no podría doler. –

+0

Cierto, y la solución ciertamente se puede optimizar bastante. Sin embargo, el enfoque en sí mismo está bien, y no hay ningún problema para que un navegador moderno maneje propiedades de 10k en un objeto. –

Cuestiones relacionadas