[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