[Python] Migliorare le prestazioni usando i core?

2013-03-31 Per discussione Aplemaser
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, 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.

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.

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. 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.

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

Ciao a tutti e grazie dell'attenzione.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Migliorare le prestazioni usando i core?

2013-03-31 Per discussione Manlio Perillo
-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
=  oppure N = n * , 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-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Migliorare le prestazioni usando i core?

2013-03-31 Per discussione Aplemaser
Il giorno 31 marzo 2013 20:32, Manlio Perillo  ha
scritto:

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

Sì lo so, ma non è il mio caso.



> 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.
>

Non conosco i C se non per i rudimenti scolastici di parecchi anni fa.




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

Ok,



> Non esiste nessun comando magico che ti parallelizzi il codice.
>

Ho capito dalla tua risposta di aver usato un termine improprio, cancella
la mia richiesta, volevo usare un sinonimo della prima.




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

Il codice è molto lungo e diviso in diversi file, copiarlo su pastebin non
è davvero possibile. In linea di massima da fonti diverse che sono file CSV
in prevalenza, ma anche alcune viste logiche (via ODBC), creo un solo
database con tutti i dati, dopo averli mergiati e manipolati secondo
necessità.



> In generale per parallelizzare del codice, lo devi partizionare in N
> pezzi indipendenti, ed eseguire ciascun pezzo in un thread.  Di solito N
> =  oppure N = n * , dipende da cosa fa
> il codice, in particolare dal tempo speso in I/O).
>
>
Non mi è familiare, ma ho capito il senso.

Grazie delle risposte.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Migliorare le prestazioni usando i core?

2013-03-31 Per discussione Manlio Perillo
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

Il 31/03/2013 21:49, Aplemaser ha scritto:
> [...]
> 
> Il codice è molto lungo e diviso in diversi file, copiarlo su pastebin
> non è davvero possibile. In linea di massima da fonti diverse che sono
> file CSV in prevalenza, ma anche alcune viste logiche (via ODBC), creo
> un solo database con tutti i dati, dopo averli mergiati e manipolati
> secondo necessità.
> 

Ok.
Allora andiamo con ordine.
Che database usi?
Quanto tempo impiega il tuo codice, e quanto tempo vorresti impiegasse?

Ciascun file CSV e vista ODBC serve per inserire i dati in una tabella
diversa?

>  
> 
> In generale per parallelizzare del codice, lo devi partizionare in N
> pezzi indipendenti, ed eseguire ciascun pezzo in un thread.  Di solito N
> =  oppure N = n * , dipende da cosa fa
> il codice, in particolare dal tempo speso in I/O).
> 
> 
> Non mi è familiare, ma ho capito il senso.

Supponi che ciascun file CSV contenga i dati da inserire in una sola
tabella.
Invece di processare ciascun file CSV in seguenza, puoi farlo in
parallelo usando un processo separato.

Ciascun processo si occuperà di:
- - aprire il file CSV
- - aprire una connessione al database
- - fare il parsing del file CSV
- - inserire i dati nel database


Dai una occhiata alla documentazione del modulo multiprocessing,
disponibile da Python 2.6.



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

iEYEARECAAYFAlFYll8ACgkQscQJ24LbaUQjwACeJjYTWnsFaNeUUW17llTAsXyf
5aYAn2E0yQ75wOpAZDp0KtL1/4gzeiug
=jwtj
-END PGP SIGNATURE-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Migliorare le prestazioni usando i core?

2013-03-31 Per discussione Aplemaser
Il giorno 31 marzo 2013 22:02, Manlio Perillo  ha
scritto:

>
> Ok.
> Allora andiamo con ordine.
> Che database usi?
> Quanto tempo impiega il tuo codice, e quanto tempo vorresti impiegasse?
>
> Ciascun file CSV e vista ODBC serve per inserire i dati in una tabella
> diversa?
>

I dati dei CSV e le viste ODBC servono, dopo opportune bonifiche (spazi
superflui, caratteri speciali, valori numerici trasformati in valori
testuali, etc), per compilare diverse tabelle diverse. Si tratta di
anagrafiche di prodotti, che hanno logiche di gestione diverse, con
disponibilità e prezzi variabili anche più volte al giorno. Questi dati
vengono poi consultati su un database MySQL, ma qui non ho nessun vincolo,
potrei usare anche altro. Le origini dei dati non sono fisicamente sulla
macchina dove risiedono script in Python e database MySQL.

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.


Supponi che ciascun file CSV contenga i dati da inserire in una sola
> tabella.
> Invece di processare ciascun file CSV in seguenza, puoi farlo in
> parallelo usando un processo separato.
>
> Ciascun processo si occuperà di:
> - - aprire il file CSV
> - - aprire una connessione al database
> - - fare il parsing del file CSV
> - - inserire i dati nel database
>
>
> Dai una occhiata alla documentazione del modulo multiprocessing,
> disponibile da Python 2.6.
>

Non è la base di partenza che ho, cioè non ho CSV tutti uguali da importare
in processi separati, ma ho capito esattamente il tuo suggerimento.

Ancora grazie mille delle risposte e dell'attenzione.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Migliorare le prestazioni usando i core?

2013-03-31 Per discussione Gianluca Sforna
2013/3/31 Aplemaser :
> 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.
>

La butto là: stai già usando le transazioni?
Visto che parliamo di import su DB dubito la CPU sia un problema, la
scrittura su disco è, di norma, sempre la parte più lenta.

--
Gianluca Sforna

http://morefedora.blogspot.com
http://identi.ca/giallu - http://twitter.com/giallu
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Migliorare le prestazioni usando i core?

2013-03-31 Per discussione Aplemaser
Il giorno 01 aprile 2013 00:48, Gianluca Sforna  ha
scritto:

>
> La butto là: stai già usando le transazioni?
>

Non le ho prese in considerazione, diciamo che grazie a voi sto
raccogliendo materiale per le mie indagini.



> Visto che parliamo di import su DB dubito la CPU sia un problema, la
> scrittura su disco è, di norma, sempre la parte più lenta.
>

Sull'utilizzo della CPU la mia è una considerazione del tutto empirica,
visto che non è solo lettura e scrittura dei file, evidentemente non è solo
utilizzo di disco. Il mio ragionamento è molto semplice e forse sbagliato
nella mia ingenuità: se nelle 4 ore in cui eseguo l'operazione 1/4 dei core
è al 99% di utilizzo, mentre gli altri 3/4 sono al 2-4%, se riesco a
scomporre il processo in modo da utilizzare 3/4 al 99% posso sicuramente
ottimizzare il tutto.

Grazie anche a te per le risposte.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Migliorare le prestazioni usando i core?

2013-03-31 Per discussione Gianluca Sforna
2013/4/1 Aplemaser :
>
> Sull'utilizzo della CPU la mia è una considerazione del tutto empirica,
> visto che non è solo lettura e scrittura dei file, evidentemente non è solo
> utilizzo di disco. Il mio ragionamento è molto semplice e forse sbagliato
> nella mia ingenuità: se nelle 4 ore in cui eseguo l'operazione 1/4 dei core
> è al 99% di utilizzo, mentre gli altri 3/4 sono al 2-4%, se riesco a
> scomporre il processo in modo da utilizzare 3/4 al 99% posso sicuramente
> ottimizzare il tutto.

Ti manca un pezzo nel ragionamento: può succedere benissimo che nelle
4 ore il 99% del tempo lo passa a leggere e scrivere su disco e l'1% a
far lavorare la CPU.

Quindi il primo passo è lasciare perdere le supposizioni e dedicarti
alla misura. Python ha diversi sistemi di profiling con cui puoi
facilmente capire dove ti conviene lavorare. Tieni prensente che non
c'è bisogno di farlo per tutte le 4 ore, ti basta un piccolo set.

--
Gianluca Sforna

http://morefedora.blogspot.com
http://identi.ca/giallu - http://twitter.com/giallu
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Migliorare le prestazioni usando i core?

2013-03-31 Per discussione Aplemaser
Il giorno 01 aprile 2013 01:08, Gianluca Sforna  ha
scritto:

>
> Ti manca un pezzo nel ragionamento: può succedere benissimo che nelle
> 4 ore il 99% del tempo lo passa a leggere e scrivere su disco e l'1% a
> far lavorare la CPU.
>
> Quindi il primo passo è lasciare perdere le supposizioni e dedicarti
> alla misura. Python ha diversi sistemi di profiling con cui puoi
> facilmente capire dove ti conviene lavorare. Tieni prensente che non
> c'è bisogno di farlo per tutte le 4 ore, ti basta un piccolo set.
>
>
Utilizzo Nagios e le mie indagini (mi inizio a sentire Clouseau) sono
partite da lì. L''accesso in scrittura sul disco e quello di utilizzo della
CPU sono dati separati, se non ho preso un abbaglio clamoroso.

Comunque ottima idea quella di fare profiling prestazionale del codice
direttamente con Python, hai qualche suggerimento o vado di Google?
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python