2012-05-15 9 views
10

Tengo un gran volcado de par key-value, que necesito buscar para mi aplicación web django-Python.¿Mantiene un diccionario grande en memoria para Django-Python?

lo tanto, tengo siguientes opciones:

  • tienda como JSON volcado y carga como un dict pitón.
  • Almacenarlo en un dump.py e importar el dict de él.
  • Utilice algunos sistemas específicos para este problema: [¿Están realmente destinados para este uso? ]
    • Mem-cache
    • Redis
    • Cualquier otra opción?

desde arriba ¿Qué es el camino correcto a seguir?

¿Cómo comparará Memcache y Redis?

Actualización:

  • Mi diccionario es de aproximadamente 5 MB en tamaño y crecerá con el tiempo.
  • Usar Redis/Memcache agrega una sobrecarga de presionar un socket cada vez, por lo que dump.py será mejor, ya que llevaría tiempo cargarlo en la memoria, pero después de eso solo haría búsquedas de memoria.

  • Mi diccionario tiene que ser actualizado cada día, teniendo en cuenta que dump.py habrá problema, ya que tenemos que reiniciar el servidor Django para recargar en tanto que creo que va a reflexionar sobre la marcha en Redis y Memcache.

  • Uno utiliza un sistema como Redis sólo cuando se tiene gran cantidad de datos y usted tiene que las operaciones de búsqueda con mucha frecuencia, en caso de que toma da una sobrecarga es así, ¿cómo lograr la ventaja?

¡Comparta su experiencia en esto!

+3

Depende. ¿Dónde está tu cuello de botella? –

+0

¿necesitas una base de datos? – moooeeeep

+0

¿Con qué frecuencia va a revisar la llave si le preocupan los enchufes? –

Respuesta

6

Para elegir Memcache o REDIS, son capaces de solicitar decenas de miles por segundo en hardware de gama baja (por ejemplo, 80,000 req/s for REDIS on C2D Q8300). Con latencias muy por debajo de 1 ms. Estás diciendo que estarás haciendo algo en orden de 20 solicitudes por segundo, por lo que en lo que respecta al rendimiento, realmente no es un problema.

Si elige la opción dump.py, no necesita reiniciar Django para volver a cargar. Usted puede hacer su propia recargador simple:

dump.py: Código

[ dict code...] 

mtime = 0 

Djago:

import dump #this does nothing if it's already loaded 
stat = os.stat(dump_filename) 
if(stat.mtime > dump.mtime): 
    reload(dump) 
    dump.mtime = stat.mtime 

+0

La parte de Redis es realmente informativa +1 para eso. reload() lo sé, pero lo recargué después de cada 'mtime', eso demora 2 segundos en cargarse y cuelga la solicitud de la página. Por lo tanto, no puedo tomar la sobrecarga de 2 segundos cada mtime. Preferiría reiniciar el servidor una vez que haya actualizado mi dict. De todos modos la recarga no es la pregunta aquí. ¡La parte de Redis es! –

+0

¿Qué quiere decir "por cada mtime"? Usted ha dicho que el diccionario se modifica diariamente, tendrá que volver a cargarlo solo una vez al día. – vartec

+0

Ya ... aquí mtime es 1 día. Está bien, dije que podría actualizarse en un día y medio. Pero, realmente no importa. La información de Redis era importante –

2

Memcached, aunque es un gran producto, es superado por Redis en mi libro. Ofrece muchas cosas que los memcached no tienen, como la persistencia.

También ofrece estructuras de datos más complejas como hashses. ¿Cuál es tu volcado de datos en particular? ¿Qué tan grande es, y qué tamaño/qué tipo de valores?

+0

Por favor, mira la actualización en la pregunta. –

1

En el pasado por un problema similar, he utilizado la idea de un dump.py. Pensaría que todas las otras estructuras de datos requerirían una capa para convertir objetos de un tipo en objetos de pitón. Sin embargo, aún creo que esto dependerá del tamaño de los datos y la cantidad de datos que maneje.Memcache y redis deberían tener una mejor indexación y búsqueda cuando se trata de conjuntos de datos realmente grandes y cosas como la búsqueda basada en expresiones regulares. Así que mi recomendación sería

JSON - Si va a servir los datos a través de http a algún otro archivo de servicio pitón - si la estructura de datos no es demasiado grande y no necesita ningún tipo especial de subidas mirada

Memcache y redis: si los datos se vuelven realmente grandes

+0

Por favor, mira la actualización en la pregunta. –

1

5Mb no es tan grande. Puede mantenerlo en la memoria en proceso, y le recomiendo que lo haga, hasta que quede claro, a partir del perfil y las pruebas, que ese enfoque no satisface sus necesidades. Siempre haz lo más simple posible.

La comunicación por zócalo en sí misma no introduce una sobrecarga. Probablemente puedas reducirlo un poco utilizando un socket de dominio Unix. En cualquier caso, si no está manteniendo sus datos en proceso, tendrá que hablar sobre algún tipo de tubería.

+0

De acuerdo ... ¿así que crees que se debe usar Redis si las búsquedas son como 5 cargas de cada página y un total de 100 páginas carga cada minuto? –

+0

@YugalJindle No, creo que debe mantener sus datos en proceso hasta que los perfiles reales muestren que está causando un problema. – Marcin

Cuestiones relacionadas