Lettura veloce file binario byte per byte

sabato 30 maggio 2009 - 18.12

Gianni77 Profilo | Junior Member

Utilizzo questo per leggere un file un byte alla volta:

Dim FS As New FileStream("test.bmp", FileMode.Open) Dim Buffer() As Byte ReDim Buffer(FS.Length - 1) For i As Integer=0 To FS.Length-1 FS.Position = i FS.Read(Buffer, i, 1) ' il contenuto di Buffer(i) viene mostrato in una tabella Next

Il fatto è che: questo sistema è estremamente lento, la lettura della bmp di test, che è di 750Kb, si prende svariati minuti, esiste un altro metodo più veloce?
e non capisco il motivo per il quale devo impostare per forza FS.Position prima della lettura quando il metodo Read, come secondo parametro accetta già un offset, difatti se non imposto la posizione del puntatore con FS.Position, il metodo read legge sempre dal punto 0 anche se gli imposto un altro punto...

totti240282 Profilo | Guru

Ovvio che è lento,prova a leggere più byte alla volta,oppure se i file non sono pesanti leggili tutti assieme.


Dim FS As New FileStream("test.bmp", FileMode.Open) Dim Buffer(FS.Length - 1) As Byte FS.Read(Buffer, 0,FS.Buffer.lenght)
C'è solo un capitano !!!!!!

Gianni77 Profilo | Junior Member

ho provato, non mi cambia nulla... è sempre lento.
Sarà forse il fatto che il risultato lo metto in una DataGridView ? E si perde li tempo per compilarla?

Jeremy Profilo | Guru

Ciao Gianni.
Puoi mostrare il codece completo???
Hai già individuato in quale punto il codice si pianta per svariati minuti???

Facci sapere...
Ciao

Gianni77 Profilo | Junior Member

Allora... Credo di aver capito che il problema sta proprio nella compilazione della datagridview, è li il collo di bottiglia. Il caricamento del buffer avviene in un istante, è quando lo devo scaricare per visualizzare i byte nella datagridview che è il problema.
Dal momento che creavo tutto a runtime (formattazione righe e colonne), ho velocizzato preimpostando questi parametri.
Altro punto di lentezza era il fatto che mano a mano che leggevo il buffer, aggiungevo una riga e quindi riempivo le celle, adesso creo prima tutte le righe insieme con datagridview.Rows.Add(count) e quindi poi con un ciclo le compilo, così pure ho risparmiato qualche secondo...
Resta il fatto che la datagridview per me è un componente davvero lentissimo per fare un'operazione del genere

Gianni77 Profilo | Junior Member

Ok il problema è proprio la DataGridView, la lettura di un file e il conseguente riversamento in un buffer si prende si del tempo, ma sono una manciata di secondi in dipendenza dalla grandezza del file.... è mettere i dati nella datagridview che occupa tempo.... troppo tempo.... mano a mano che aumentano le righe da inserire, ci mette sempre più tempo. Mi pare di aver capito googlando un po che in effetti tale controllo sfrutta le librerie GDI per cui ogni riga inserita si deve ridisegnare, per cui ecco spiegato il motivo della estrema lentezza quando le righe sono assai....
ma non ho trovato un modo per evitare questo fatto, ho provato a renderla invisibile e quindi visualizzarla a fine compilazione... non serve a nulla...
altri dicono di usare SuspendLayout e ResumeLayout a fine elaborazione... non serve a nulla... altri ancora BeginEdit(True) e EndEdit.... ovviamente manco questo serve a nulla e manco usandoli tutti e 3 si risolve nulla....
Arrivati a questo punto.... non so se abbandonare tale componente e utilizzarne qualcun altro (ma quale?) o chiedo a voi consiglio come fare per visualizzare grandi quantità di dati in una datagridview senza rallentare cosi tanto durante la sua compilazione o se esiste componente simile che mi permette di modificare i valori nelle celle
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5