Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
if (!file.open(QFile::ReadOnly | QFile::Text))
{
return;
}
QTextStream stream(&file);
//calcolo quante righe ci sono nel file:
int num_righe=0;
while(!stream.readLine().isNull())
{
num_righe++;
}
ma dato che il file, come ho detto, è molto grande ci mette troppo a fare questo while.
Tra l'altro ho visto che da console è possibile ottenere questo valore molto velocemente:
Comunque la differenza di velocità rispetto a "wc" potrebbe essere dovuta al fatto che la classe QFile delle Qt esegua una serie di controlli per garantire l'accesso "protetto" al file.
Se ti interessa la velocità pura probabilmente ti conviene utilizzare le primitive base (non credo che la classe fstream del C++ sia molto più lenta delle primitive C).
mcosta ha scritto:Mi scuso per l'erroraccio nel codice proposto
Comunque la differenza di velocità rispetto a "wc" potrebbe essere dovuta al fatto che la classe QFile delle Qt esegua una serie di controlli per garantire l'accesso "protetto" al file.
Se ti interessa la velocità pura probabilmente ti conviene utilizzare le primitive base (non credo che la classe fstream del C++ sia molto più lenta delle primitive C).
Ora ho anche provato ad inserire nel mio codice la parte di "wc" che esegue l'operazione di conto:
prova a bufferizzare un po che rendi tutto velocissimo.. ti costa un po di piu' in memoria pero'
QByteArray QIODevice::read ( qint64 maxSize ) ad esempio con questa.. potresti leggere blocchi di file di tipo umm 10k (solitamente non si va sopra i 4k per portabilita' su sistemi micro tipo una calcolatrice .) e su sti 10k (che stanno in memoria) potresti contare quanti \r o \r\n vi sono
questa e' una lettura non carattere per carattere, ma bufferizzata. e' piu' performante perche' il file viene mappato in memoria centrale con spezzoni piu' grandi.
nessuno ti vieta di caricare un file enorme (100mega) in memoria in un colpo solo :>
alessiodf ha scritto:prova a bufferizzare un po che rendi tutto velocissimo.. ti costa un po di piu' in memoria pero'
QByteArray QIODevice::read ( qint64 maxSize ) ad esempio con questa.. potresti leggere blocchi di file di tipo umm 10k (solitamente non si va sopra i 4k per portabilita' su sistemi micro tipo una calcolatrice .) e su sti 10k (che stanno in memoria) potresti contare quanti \r o \r\n vi sono
questa e' una lettura non carattere per carattere, ma bufferizzata. e' piu' performante perche' il file viene mappato in memoria centrale con spezzoni piu' grandi.
nessuno ti vieta di caricare un file enorme (100mega) in memoria in un colpo solo :>
Ora provo, però non è possibile caricare tutto in memoria dato che il file è da più di 500MB .
Continuo però a non caqpire come fa "wc" ad essere così veloce....
in questo modo la velocità di scansione del file si avvicina molto a quella di "wc" quindi non posso che ritenermi soddisfatto....
Ho provato ad alzare utleriormente la quantità di byte bufferizzata ma non sembra migliorare quindi mi sono fermato a 500K.
Grazie mille del consiglio .
PS. Per completezza, ammesso che interessi a qualcuno , descrivo un po' meglio cosa fa questa piccola applicazione così magari può essere utile a qualcun'altro:
il programma ha lo scopo di caricare su un db mysql dei dati che si trovano in un file di testo sotto forma di stringhe di lunghezza fissa. Il fatto è che essendo un file molto grande questa operazione richiede del tempo così ho pensato di visualizzare a video una piccola barra di scorrimento. La barra di scorrimento però va inizializzata (giustamente) con un valore minimo e massimo in modo che lo scorrimento percentuale sia fedele allo stato dell'operazione in corso. In conclusione mi serviva sapere il numero di righe nel file prima di iniziare a caricarle nel db...
con questa, risparmi un ciclo.. e credo che se lo fai fa a qt, e' sicuramente piu' performante! quindi passagli '\n' ad esempio e prova ad aumentare il buffer size
edit: qt 4.4 fa questo per contare i caratteri in un qbyte array:
int QByteArray::count(char ch) const
{
int num = 0;
const char *i = d->data + d->size;
const char *b = d->data;
while (i != b)
if (*--i == ch)
++num;
return num;
}
alessiodf ha scritto:int QByteArray::count ( char ch ) const
con questa, risparmi un ciclo.. e credo che se lo fai fa a qt, e' sicuramente piu' performante! quindi passagli '\n' ad esempio e prova ad aumentare il buffer size
edit: qt 4.4 fa questo per contare i caratteri in un qbyte array:
int QByteArray::count(char ch) const
{
int num = 0;
const char *i = d->data + d->size;
const char *b = d->data;
while (i != b)
if (*--i == ch)
++num;
return num;
}
QByteArray::count mi era sfuggito... l'ho appena provata e forse guadagno mezzo secondo ma a parte la velocità resta comunque più pulito il codice del programma...
Se adesso troviamo un metodo di QFile che conta da solo le righe di un file di testo....
const int LINE_SIZE = 100; // esempio 100 caratteri
QFile file(nomeFile);
int linesCount = file.size() / (LINE_SIZE + 1); // il +1 e' per considerare il ritorno a capo
mcosta ha scritto:
Ma allora dillo che non hai voglia di lavorare
Se avevo voglia di lavorare non mi appassionavo all'informatica...
Comunque la tua soluzione non è adatta al mio scopo per il fatto che non ho la garanzia assoluta che le righe siano tutte della stessa lunghezza anche se è molto probabile. Perferisco qualcosa di preciso.