[Python] Migliorare le prestazioni usando i core?

Daniele Varrazzo piro a develer.com
Lun 1 Apr 2013 16:54:57 CEST


On 2013-03-31 22:58, Aplemaser wrote:

> Attualmente il tempo di importazione è di 4 ore o poco meno. Voglio 
> ridurre
> il tempo, ma non so fino a quanto posso arrivare. Tutto è nato perchè 
> ho
> notato che 3 core su 4 dormono i sonni dei giusti mentre l'altro 
> corse
> lavora come un pazzo e quindi vorrei impegnare la CPU per ridurre 
> questi
> tempi.

Hai ragione: facendo andare in parallelo i core sfrutteresti meglio la 
macchina, e il tuo problema non è I/O bound altrimenti non vedresti 
neanche quel singolo core maxxato.

Come farlo non è gratis e non c'è una ricetta generica. Se il tuo input 
è su tanti file, lancia 4 processi in parallelo e fai lavorare ognuno su 
1/4 dell'input. Se il file di input è uno solo puoi spezzare il processo 
in due parti: uno che legge l'input, lo spezza e ne manda i pezzi in una 
coda; altri 3-4 processi che leggono dalla coda in round-robin e fanno 
il loro lavoro sul pezzetto. Per questo tipo di lavori ZeroMQ è 
perfetto: ha poco overhead e le primitive giuste per questo tipo di 
coordinazione. Come detto non esistono ricette generiche, ma esistono 
dei pattern generici, e 0MQ rende abbastanza semplice implementarli.

Tieni conto che, dopo l'elaborazione, passare i dati a MySQL come stai 
probabilmente facendo (con delle INSERT) non è il modo più efficiente. 
Su PostgreSQL usare COPY è almeno 20 volte più efficiente di INSERT per 
il bulk-load dei dati. Se MySQL è opzionale come dici, abbandonalo e usa 
postgres: psycopg offre supporto a COPY da Python 
<http://initd.org/psycopg/docs/usage.html#copy>. Se resti in MySQL penso 
tu possa usare LOAD DATA INFILE per velocizzare il caricamento, ma è un 
po' più articolato (devi salvare i dati in un file temporaneo o creare 
una pipe).


-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python