2012-05-15 7 views
10

Ho un grande dump di coppia key-value, che ho bisogno di cercare la mia webapp django-Python.Mantieni un grande dizionario in memoria per Django-Python?

Così, ho seguenti opzioni:

  • Conservarlo come JSON discarica e caricarlo come un dict pitone.
  • Memorizzalo in un dump.py e importa il codice da esso.
  • Utilizzare alcuni sistemi di destinazione per questo problema: [Sono davvero pensati per questo caso? ]
    • Mem-cache
    • Redis
    • Qualsiasi altra opzione?

Quale dall'alto è la strada giusta da percorrere?

Come sarà possibile confrontare memcache e redis?

Aggiornamento:

  • mio dizionario è di circa 5 MB dimensioni e crescerà nel tempo.
  • L'utilizzo di Redis/Memcache aggiunge un sovraccarico di colpire una presa ogni volta, quindi dump.py sarà migliore poiché sarebbe necessario del tempo per caricarlo in memoria, ma dopo avrebbe solo fatto ricerche di memoria.

  • mio dizionario deve essere aggiornato ogni giorno, se si considera che dump.py sarà problema, dal momento che abbiamo per riavviare il Django server per ricaricare dove, come credo che rifletterebbe al volo in Redis e memcache.

  • si usa un sistema come Redis solo quando si dispone di grandi quantità di dati e si deve ad occhiata molto frequentemente, in questo caso presa dà una testa così, come possiamo raggiungere il vantaggio?

Si prega di condividere le vostre esperienze su questo!

+3

Dipende. Dov'è il collo di bottiglia? –

+0

hai bisogno di un database? – moooeeeep

+0

Quante volte starai controllando la chiave se sei preoccupato per le prese? –

risposta

6

Per la scelta di Memcache o REDIS, sono in grado di effettuare decine di migliaia di richieste al secondo su hardware di fascia bassa (ad esempio 80,000 req/s for REDIS on C2D Q8300). Con latenze di ben inferiore a 1 ms. Stai dicendo che stai facendo qualcosa in ordine di 20 richieste al secondo, quindi in termini di prestazioni è davvero non-problema.

Se si sceglie l'opzione dump.py, non è necessario riavviare Django per ricaricare. È possibile rendere il proprio semplice reloader:

dump.py: codice

[ 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 Redis è davvero informativa +1 per quello. reload() è noto a me, ma lo ho ricaricato dopo ogni 'mtime', che richiede 2 secondi per caricare e riagganciare la richiesta di pagina. Quindi, non posso prendere l'overhead di 2 secondi ogni Mtime - preferirei riavviare il server una volta che ho aggiornato il mio dict. Comunque il ricaricamento non è la domanda qui. La parte di Redis è! –

+0

Cosa intendi per "ogni mtime"? Hai detto che il dizionario viene modificato ogni giorno, dovrai ricaricarlo solo una volta al giorno. – vartec

+0

Ya .. qui mtime è 1 giorno. Va bene, ho detto che potrebbe essere aggiornato in un giorno e mezzo. Ma non importa. Le informazioni di Redis erano importanti –

2

Memcached, sebbene un ottimo prodotto, è trionfato da Redis nel mio libro. Offre molte cose che memcached non ha, come la persistenza.

Offre anche strutture di dati più complesse come hashs. Qual è il tuo particolare dump di dati? Quanto è grande e quanto è grande/che tipo di valori?

+0

Per favore, vedi l'aggiornamento nella domanda. –

1

In passato per un problema simile ho utilizzato l'idea di dump.py. Penserei che tutte le altre strutture di dati richiederebbero un livello per convertire oggetti di un tipo in oggetti python. Tuttavia, continuerei a pensare che ciò dipenderà dalla dimensione dei dati e dalla quantità di dati che si stanno gestendo.Memcache e redis dovrebbero avere indici e ricerche migliori quando si tratta di set di dati veramente grandi e cose come la ricerca basata su espressioni regolari. Così la mia raccomandazione sarebbe

JSON - se si sta servendo i dati su HTTP per qualche altro file servizio python - se la struttura dei dati non è troppo grande e non ha bisogno di alcun tipo speciale di look up

memcache e redis - se i dati diventano veramente grandi

+0

Per favore, vedi l'aggiornamento nella domanda. –

1

5Mb non è così grande. Potresti tenerlo in memoria in corso, e ti consiglio di farlo, finché non sarà chiaro dalla profilazione e dal testing che tale approccio non soddisfa le tue esigenze. Fai sempre la cosa più semplice possibile.

La comunicazione socket di per sé non introduce gran parte di un sovraccarico. Probabilmente potresti ridurlo un po 'usando un socket dominio unix. In ogni caso, se non stai mantenendo i tuoi dati in lavorazione, dovrai parlare con una specie di pipe.

+0

Concordato .. quindi pensi che i redis dovrebbero essere usati se le ricerche sono come 5 pagine caricate ogni 100 caricamenti di pagine ogni minuto? –

+0

@YugalJindle No, penso che dovresti tenere i tuoi dati in lavorazione fino a quando il profilo non ti mostra che sta causando un problema. – Marcin