[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