[Python] split di file di grandi dimensioni

Daniele Varrazzo piro a develer.com
Sab 5 Dic 2009 01:46:45 CET


On Sat, 05 Dec 2009 00:32:22 +0100, Pietro Battiston <toobaz a email.it>
wrote:

>     def processa_linea(linea):
>        contenuto = estrai_contenuto(linea)
>        target = estrai_target(linea)
> 
>        if not target in self.diz:
>            self.diz[target] = []
> 
>        self.diz[target].append(contenuto)
>        
>        self.contatore_linee += 1
> 
>        if self.contatore_linee > MEMORIA_MAX:
>            # Si arriva qui al più N_RIGHE * (N_FILE/MEMORIA_MAX) volte
>            # (dignitoso purché N_FILE**2 <= MEMORIA_MAX, dato che
>            #  le righe seguenti hanno costo grosso modo N_FILE)
>            popolarità_massima = 0
>            for un_target, sua_lista in zip(self.diz, self.diz.values):
>                popolarità = len(sua_lista)
>                if popolarità > popolarità_massima:
>                    il_più_popolare = un_target
>                    popolarità_massima = popolarità
> 
>            self.scrivi_su_file_e_svuota_lista(il_più_popolare)       
> 
>            self.contatore_linee -= popolarità_massima

Ho capito: praticamente mantieni il numero di righe memorizzate compreso
tra il massimo e il massimo meno la dimensione della lista maggiore.

Il fatto è che mi sembra parecchio più complicato pur non risolvendo alcun
problema sostanziale: così diminuisci il numero di scritture in caso di
distribuzioni distanti dall'uniformità al limite del patologico, ma già con
la versione "semplice" dell'algoritmo le scritture sono passate (per i
numeri usati negli esempi fatti finora) dalle originali 1e9 a 1e6: mi
sembra che questo sia uno di quei casi in cui "il meglio è nemico del
bene".


-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com


Maggiori informazioni sulla lista Python