[Python] Migliorare le prestazioni usando i core?

Manlio Perillo manlio.perillo a gmail.com
Lun 1 Apr 2013 15:44:47 CEST


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

Il 31/03/2013 23:58, Aplemaser ha scritto:
> Il giorno 31 marzo 2013 22:02, Manlio Perillo <manlio.perillo a gmail.com
> <mailto:manlio.perillo a gmail.com>> ha scritto:
> 
> 
>     Ok.
>     Allora andiamo con ordine.
>     Che database usi?
>     Quanto tempo impiega il tuo codice, e quanto tempo vorresti impiegasse?
> 
> [...]
> Attualmente il tempo di importazione è di 4 ore o poco meno. Voglio
> ridurre il tempo, ma non so fino a quanto posso arrivare.

Con ottimizzazioni molto aggressive (sia sul tuo codice che sulla
configurazione del database) non è impossibile scendere sotto i 30 minuti.

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

L'alto utilizzo della CPU è solo del tuo programma, o di tutto il
sistema (quindi incluso eventualmente il database) ?

Se usi un sistema UNIX, puoi utilizzare il comando time per ottenere
valori precisi dei tempi impiegati.

Di preciso posso dirti che se i bytes totali dei file CSV sono
dell'ordine dei 10GB, puoi ottenere un incremento di prestazioni da 5 a
8 volte *solo* ottimizzando il codice.  Lo dico per esperienza personale
con un parser che deve leggere riga per riga un file di 60G, e che
l'implementazione ottimizzata scritta in C richiede 8 minuti, mentre
quella Python e quella in C non ottimizzato richiedono più di un ora (ma
non so di preciso quanto, perchè non avevo voglia di aspettare).

Se poi devi inserire grosse moli di dati nel database, l'ottimizzazione
della configurazione del database può portare ad incrementi di
prestazioni notevoli.  PostgreSQL permette *molte* ottimizzazioni, dal
semplice e safe comando COPY a ottimizzazioni più agressive (e
pericolose per l'integrità dei dati in caso di crash).

Le ottimizzazioni che puoi fare dipendono da come processi i dati, e da
come usi il database.  Per questo dicevo che devi spiegare in modo
chiaro e completo cosa devi fare, altrimenti chi legge può solo darti
consigli generici che magari hanno il solo risultato di fare aumentare
la tua confusione.



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

Io non ho detto che devi avere files tutti uguali.
L'importante che per processare ed inviare al database i dati di un file
CSV, tu non abbia bisogno dei dati presenti in altri file CSV.

> Ancora grazie mille delle risposte e dell'attenzione.
> 

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

iEYEARECAAYFAlFZj08ACgkQscQJ24LbaUSrGQCeNWQd1C4uwQCoKCVkgRndKDgn
oLMAoI7rjrQfpGE4x4up9l6nEbYrTo35
=txpm
-----END PGP SIGNATURE-----


Maggiori informazioni sulla lista Python