[Python] Python, redis e bottleneck
Pietro Battiston
me a pietrobattiston.it
Ven 20 Dic 2013 16:28:36 CET
Il giorno gio, 19/12/2013 alle 14.53 +0100, Manlio Perillo ha scritto:
> On 19/12/2013 12:52, Pietro Battiston wrote:
> > [...]
> > OK, ragionevole dubbio. Prendi _questo_ codice:
> >
> > import redis
> > import random
> >
> > r = redis.Redis(db=0)
> >
> > try:
> > while True:
> > r[random.random()] = random.random()
> > except KeyboardInterrupt:
> > r.flushdb()
> >
>
> Consiglio: se vuoi prestazioni **non** usare API di alto livello
> "Pythoniche". Di solito sono scritte con la convenienza in mente, senza
> pensare minimamente alle prestazioni.
>
> Una velocissima ricerca su google (redis batch commands) riporta:
> http://redis.io/topics/mass-insert
>
... e un paio di ricerche dopo sono arrivato... alla documentazione
ufficiale:
http://redis-py.readthedocs.org/en/latest/#redis.Redis.pipeline
(shame on me)
Sostanzialmente, il seguente codice
import redis
import random
import time
PIPELINE = True
TRANSACTION = False
r = redis.Redis(db=0)
if PIPELINE:
r = r.pipeline(transaction=TRANSACTION)
count = 0
now = time.time()
try:
while True:
r[count] = count
count = (count + 1) % 10000
if not count:
new_now = time.time()
print new_now - now
now = new_now
if PIPELINE:
r.execute()
except KeyboardInterrupt:
r.flushdb()
... da me gira circa 5 volte pių veloce che con "PIPELINE = False", e un
25% pių veloce che con "TRANSACTION = True". Ovviamente con la CPU "di
python" utilizzata quasi al massimo.
Per il problema da cui ero partito, il caricamento di un dump json del
database, il guadagno č circa di un fattore 3 - quindi effettivamente le
query continue erano un bottleneck molto pių di quanto il solo tempo di
CPU speso in kernel space mi permettesse di immaginare.
Probabilmente la soluzione mass-insert č ancora pių efficiente (non ho
ancora avuto tempo di provare) - di certo la rappresentazione su disco č
molto pių appropriata di un json...
ciao e grazie mille della dritta salvifica
Pietro
Maggiori informazioni sulla lista
Python