[Python] Ottimizzare la lettura/scrittura di grossi blocchi di dati su file.
Manlio Perillo
manlio.perillo a gmail.com
Mar 25 Giu 2013 18:56:29 CEST
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Il 25/06/2013 01:37, Gollum1 ha scritto:
> Ciao pyamici!
>
> il mio progetto sta andando avanti...
>
> ad ora procedo con la lettura di un file (tendenzialmente di
> grosse/grossissime dimensioni) con blocchi da 1MB o poco pių
> direttamente in memoria, dove poi procedo all'elaborazione, e scarico
> ogni blocco prima del caricamento del successivo in un file.
>
> il dubbio che mi sorge, č se in prospettiva, da prove che stanno
> effettuando alcuni amici che mi fanno da betatester, i blocchi singoli
> ottimali si dimostrano di dimensioni maggiori, come credete che possa
> essere gestita la cosa?
Che intendi con blocchi singoli ottimali?
Intendi dire se la lettura/scrittura del file č pių efficiente con
blocchi di, ad esempio, 2MB invece di 1MB?
La soluzione pių semplice č avere la dimensione del blocco configurabile.
> procedere comunque per blocchi di 1MB e
> riversarlo direttamente nel file fino a raggiungere la dimensione di
> blocco ottimale per le lavorazioni successive?
>
Non ho capito cosa intendi fare...
> in questo caso, come mi consigliate di modificare il seguente blocco
> di programma?
>
> project.source_size = 0
> block_counter = 0
> block = {}
>
> while True:
> block[block_counter] = ib_file_data_support.Block(line_args,
> project, block_counter)
> block[block_counter].data = fi.read(project.BUFFER_SIZE)
>
Faccio fatica a comprendere il motivo per cui memorizzi il buffer in
block[block_counter].data per poi cancellarlo in seguito...
Perchč non fare semplicemente:
data = fi.read(project.BUFFER_SIZE)
?
> if not block[block_counter].data:
> block.pop(block_counter)
> break
>
> # Aggiungo la dimensione del blocco alla dimensione del file sorgente.
> project.source_size += len(block)
>
> # Eseguo tutte le altre operazioni sui blocchi/file.
>
Che operazioni? Operi sui singoli blocchi?
> # ELimino il blocco di dati elaborato.
> block[block_counter].data = None
> # Incremento il contatore di blocco e leggo il prossimo blocco.
> block_counter += 1
>
>
> praticamente la seconda riga del ciclo while, in cui carico i dati
> leggendoli dal file, dovrebbe diventare a sua volta un ciclo while (o
> qualcosa di corrispettivo) che ad ogni ciclo legge un blocco da 1MB
Perchč? Per leggere dal file N blocchi basta un solo ciclo.
> e
> lo riversa sul file indicato all'interno della classe blk... a questo
> punto credo che convenga mettere una funzione di load dentro la classe
> direttamente...
>
> che ne pensate? avete qualche suggerimento dettato dalla vostra esperienza?
>
Non sono sicuro di capire cosa stai facendo. Un filtro:
while True:
buf = fin.read(buf_size)
buf = filter(buf)
fout.write(buf)
?
> [...]
Ciao Manlio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iEYEARECAAYFAlHJy70ACgkQscQJ24LbaUS/TQCfQ5i++OszhPWBj032V3bwZLx4
mXcAn2gnxGqYWy+zBzpXSi/e/671l1j2
=YiY9
-----END PGP SIGNATURE-----
Maggiori informazioni sulla lista
Python