PDA

Visualizza la versione completa : [C/C++] Leggere un file più velocemente


Nebula88
29-11-2008, 23:21
Salve a tutti! :)

Ragazzi, dovrei leggere una matrice da un file di testo in modo più efficiente possibile.
Purtroppo la classe fstream è parecchio lenta, sapreste suggerirmi un metodo più veloce?

Grazie! :yuppi:


Allego il codice che ho utilizzato (semplice e niente di artificioso)





bool** M = new bool*[b];

for(int i=0; i<b; i++)
M[i] = new bool[b]; // b è la dimensione della matrice

ifstream file("file.txt");

for(int i=0; i<b; i++)
for(int j=0; j<b; j++)
file >> M[i][j];

MacApp
30-11-2008, 04:10
Originariamente inviato da Nebula88
Purtroppo la classe fstream è parecchio lenta,

Parecchia lenta rispetto a cosa?
Quanto e' grande la tua matrice (che sembra essere quadrata)?
Stai compilando in modalità debug o deployment (release)?
Hai provato ad utilizzare un profiler?
Chi ti dice che la "lentezza" del tuo programma non sia dovuta ad altri fattori? (ad esempio disco lento danneggiato ultra frammentato.. che sistema operativo usi?)

Nebula88
30-11-2008, 11:48
Ciao!

In pratica si tratta di un progetto per l'università, ovvero la risoluzione di un labirinto dato tramite un file.

Ho utilizzato un opzione di CodeBlocks che mi permette di calcolare il tempo di esecuzione di ogni singola funzione del mio programma, e risulta che la lettura del file impiega circa il 70% del tempo totale.

E' per questo che chiedo se esiste qualche metodo alternativo..

:ciauz: :ciauz: :ciauz:

P.s. Scusa l'ignoranza, ma non so cosa sia un profiler e tantomeno cosa cambi tra le due modalità di compilazione..

menphisx
30-11-2008, 13:32
Debug --> Il compilatore aggiunge dell informazioni riguardo all'eseguibile, per facilitare il debug.
Release --> Il compilatore non aggiunge niente.

Profiler, MacApp cos'è ?

Se vuoi leggere velocemente da file, ci sarebbe l'automa a stati finiti :malol:

MacApp
30-11-2008, 14:26
Originariamente inviato da menphisx
Profiler, MacApp cos'è ?


http://en.wikipedia.org/wiki/Profiler_(computer_science)
http://www.efnetcpp.org/wiki/Profiler

Nebula88
30-11-2008, 14:51
Originariamente inviato da menphisx

Se vuoi leggere velocemente da file, ci sarebbe l'automa a stati finiti :malol:

Si tratta del post che c'è in questo forum vero?
L'ho letto un po' ma mi sembra un tantino complicato...
Mi aiuteresti nella comprensione?..

Nebula88
30-11-2008, 14:54
E poi,..
mi sembra di aver notato che la classe fstream non copi il file nella RAM ma acceda ogni volta all'hard disk!

Questo non rende molto più lenta la lettura?!..

Vincenzo1968
01-12-2008, 14:22
Originariamente inviato da Nebula88
Si tratta del post che c'è in questo forum vero?
L'ho letto un po' ma mi sembra un tantino complicato...
Mi aiuteresti nella comprensione?..

Puoi vedere questo esempio:

http://forum.html.it/forum/showthread.php?s=&threadid=1257749&perpage=15&highlight=&pagenumber=1

MItaly
01-12-2008, 15:31
Originariamente inviato da Nebula88
E poi,..
mi sembra di aver notato che la classe fstream non copi il file nella RAM ma acceda ogni volta all'hard disk!

Questo non rende molto più lenta la lettura?!..
No, la fstream fornisce accesso bufferizzato ai file, per cui dovrebbe essere relativamente veloce. Se vuoi un buon compromesso tra la comodità della classe fstream e la velocità dell'automa a stati finiti usa la libreria di IO del C (fopen, fscanf, fclose); in ogni caso, quanto tempo ci mette il tuo programma a caricare i dati dal file?

Nebula88
02-12-2008, 16:14
Buone Nuove!
Ho trovato un metodo che mi permette di risparmiare un sacco di tempo..
In pratica, carico il file di in una volta in un array di caratteri:



int length;
char* buffer;

ifstream is("nomefile");

is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);

buffer = new char [length];

is.read (buffer,length);
is.close();


Tutta via, copia nell'array anche gli spazi (che a me non servono) ed altri caratteri strani (incluso lo /n), sapreste dirmi come omettere la copia?!..

Loading