[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