[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