[Python] Migliorare le prestazioni usando i core?

Manlio Perillo manlio.perillo a gmail.com
Dom 31 Mar 2013 20:32:29 CEST


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Il 31/03/2013 20:18, Aplemaser ha scritto:
> Ciao a tutti e buona pasqua.
> 
> Dopo aver sviluppato, con estrema soddisfazione, un applicativo che
> importa/trasforma/riscrive una notevole mole di dati (almeno per me) da
> uno o più file CSV ad un database SQL,

Alcuni database come PostgreSQL sono in grado di leggere direttamente
files in formato CSV, ovviamente aggiungendo un header opportuno.

> ora sto affrontando la difficile
> opera di tuning, perché i tempi sono "importanti" dovendo interagire con
> oltre 20.000.000 di record tutti i santi giorni.
> 

In linea di massima, e in particolare considerando come hai sviluppato
il codice (ossia se passi molto tempo a manipolare stringhe, invece che
a leggere/scrivere su file), una riscrittura in C dovrebbe risolvere il
problema senza usare threads addizionali.

> Dallo studio delle prestazioni hardware della macchina che esegue
> l'operazione ho notato che solo uno dei 4 core presenti durante la
> lavorazione va a saturazione, mentre gli altri restano relativamente a
> riposo.
> 

Certo, perchè in qualsiasi linguaggio, a meno di non avere codice
speciale, usi sempre e solo un unico thread.

> Ammetto di essere un completo ignorante in materia e mi scuso se la
> domanda non è pertinente, ma dopo aver girovagato in rete (a dire il
> vero ho trovato molte informazioni datate, non so se più valide) mi è
> sembrato di capire che si potrebbero usare dei moduli precisi per far
> usare più core, come threading o processing.

Esatto.
Quale usare dipende però da cosa fa il tuo codice.  In generale se usi
più processi è meglio, perchè in Python può girare solo un thread alla
volta (cerca su Internet Python GIL).

> Prima di fare/dire
> bestialità ho pensato di chiedere consiglio a voi che magari avete già
> avuto esperienza similari, magari indicandomi delle risorse di esempio.
> L'obbiettivo è di eseguire più operazioni in parallelo anziché in una unica.
> 

Non esiste nessun comando magico che ti parallelizzi il codice.

> Tanto per completare l'informazione la versione di Python utilizzata è
> la 2.7 su un sistema Debian 6.0.6.
>

Devi dirci esattamente cosa sta facendo il tuo codice.
Meglio se il codice è breve e lo puoi mettere su pastebin o simili.

In generale per parallelizzare del codice, lo devi partizionare in N
pezzi indipendenti, ed eseguire ciascun pezzo in un thread.  Di solito N
= <numero di core> oppure N = n * <numero di core>, dipende da cosa fa
il codice, in particolare dal tempo speso in I/O).


Ciao  Manlio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAlFYgT0ACgkQscQJ24LbaUSsAwCfRFrwaWlauyXhmxFBXStBM7+d
50gAoIgRJlu/eARDifEKeSAPItFNQdy2
=B/ME
-----END PGP SIGNATURE-----


Maggiori informazioni sulla lista Python