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 _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python