[Python] Migliorare le prestazioni usando i core?
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?
-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?
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?
-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?
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/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?
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/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?
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