[Python] split di file di grandi dimensioni

Pietro Battiston toobaz a email.it
Ven 4 Dic 2009 19:05:12 CET


Il giorno ven, 04/12/2009 alle 13.39 +0100, Daniele Varrazzo ha scritto:
> On Fri, 4 Dec 2009 13:32:56 +0100, Marco Beri <marcoberi a gmail.com> wrote:
> > 2009/12/4 Ernesto <e.picardi a unical.it>
> > 
> >>
> >>  oltre a questo (che cmq porterà i maggiori benefici) potremmo
> >>  guadagnare
> >>> qualcosa anche con:
> >>>
> >>> Il link che ho postato usa un approccio diverso. Usa delle liste in
> >>> memoria e scrive solo quando ha raggiunto una certa soglia.
> >>>
> >>> Solo due file aperti al massimo ed esecuzione molto veloce (infatti
> >>> scrive
> >>> un blocco di molte righe e non una per volta).
> >>>
> >>>
> >> Stavo tentando un approccio simile. In pratica potrei creare un
> >> dizionario
> >> dove associare ad ogni valore una lista con le singole righe e poi
> >> scriverle
> >> su file se la lista è uguale ad un numero prefissato di righe.
> > 
> > 
> > Ok, attento in uscita dal loop: devi scrivere le ultime righe rimaste
> nel
> > dizionario.
> > 
> > E ricordati di avere un limite massimo di righe tale da gestire anche la
> > situazione peggiore:\
> >  MAX_LENGTH * MAX_NUM_FILE * (MAX_RIGHE - 1)
> > 
> > Murphy è sempre in agguato :-)
> 
> Io infatti avrei salvato tutti i dizionari dopo un numero prefissato di
> righe lette dal file di input. In questo modo l'occupazione di memoria è
> controllata e le prestazioni credo siano in linea (qualche file potrebbe
> avere poche righe, ma se su 1000 file aperti si scrivono 1M di righe
> statisticamente siamo lì). Credo sia anche molto più semplice da scrivere e
> meno soggetto ad errori.
> 

A me sembrerebbe più efficiente una via di mezzo: si scrive su file ogni
volta che si è raggiunta l'occupazione massima di memoria, ma si scrive
solo il file con più righe (da scrivere).

Significa semplicemente ogni volta che c'è da scrivere fare un max su
una lista di 1000 elementi (quella delle lunghezze, che può essere
tranquillamente creata al volo - len ha costo costante, giusto?), e non
mi sembra che possa avere un gran impatto, anche nel caso pessimo in cui
le righe destinate ai diversi file ricorrano con frequenze molto simili.

Pietro



Maggiori informazioni sulla lista Python