Newsgroup: it.comp.lang.perl
Titolo: Velocita' massima !

problema leggere solo le ultime righe di un file di testo con 10000-50000
righe.
Metodo A : carico tutto il file in memoria in un colpo e prendo l'ultima
riga.
 secondi :  +/- 0.09 per caricarlo 0 perl leggere la riga.
Metodo B : uso IO::File, trovo l'ultima riga e leggo solo quella:
 tempo secondi +/- 0.08 per caricare  il modulo " IO::File" e  +/- 0.01 per
prendere la riga.
In sostanza IO::File e' velocissimo ma se lo devo fare su un solo file ed e'
il mio caso
il caricamento del modulo fa si che i tempi totali +/- si equivalgono.
In totale il tempo e' poco, circa 1/10 di secondo... ma fate conto che ogni
utente collegato
lo lancia 3 volte al minuto e gli utenti potrebbero essere diverse
centinaia... sarebbe bello
trovare una soluzione C   e ridurre a 2-3 centesimi  il tempo totale :-)
( prove sul mio portatile AMD 1200 256 RAM  credo +/- come il server)
Ciao

il tempo totale :-)
Be', c'č tail.
Ciao.

Oxy wrote:

Temo che per rendere la tua applicazione scalabile (con i numeri che ci hai
fornito) tu debba pensare a soluzioni alternative che a memorizzare le
informazioni su un unico file di testo! :-)
Inoltre per valutare meglio le prestazioni ti consiglio di fare dei benchmark
con
gli appositi moduli e simulare il carico del server con stress test (utilizzando
ad
esempio semplici tool quali 'httperf' o 'ab')
by
    - Enrico

 trova tutto quello che serve si va un po' indietro, e cosě via.
E' quello che faccio con il metodo B usando IO:File, una soluzione postatami
qui mesi
fa, si puo' fare senza IO::File ?
Grazie


 Certo che dovrei rifare tutto, per ora non posso!
però non so se ci voglia tanto a capire com'é fatto il database, ordinare il
database in qualche maniera e spezzare i files dandogli dei nomi appropriati
che richiamano quello che c'é dentro.
Con uno script non é difficile, credo.
Ma fai una copia di backup.
Nubbiuo

qui mesi fa, si puo' fare senza IO::File?
Premesso che, come ti hanno detto altri, può non essere l'approccio ottimale
al tuo problema (che io non conosco), dato il problema astratto di leggere
le ultime righe di un file, certamente che si può tentare un algoritmo che
utilizzi solo le funzioni fondamentali di perl.
Non mi sento in questo momento di dettagliartelo (anche perché non conosco
la struttura del file che devi leggere), ma in sostanza si tratta di
utilizzare la funzione seek FILEHANDLE,POSITION,WHENCE per posizionarsi ad
una certa distanza (da stimare in qualche modo) dalla fine del file (WHENCE
= SEEK_END = 2). Occorre poi qualche accorgimento per resettare la
condizione di EOF e ripetere la lettura, nel caso che la stima iniziale si
rivelasse errata, ma il tutto si riduce in sostanza a poche righe di codice.
Ciao.

 Ciao.

 codice.
Eccolo,  come posso eliminare IO ? .. Serve solo per far riferimento al file
?
sub LINE_GUESS { 180 }
########################
sub get_last_line_position
{
 # l'arg. può essere indifferentemente un nome file, un reference a un
filehandle, o un oggetto IO::File
use strict;
my $arg = shift;
my  $fh = ref($arg) ? IO::File->new_from_fd( $arg, "r" ) : IO::File->new(
$arg, "r" );
if( not $fh ){ warn "get_last_line_position: $!\n";  return undef; }
my $fsize = -s $fh;
return 0 if $fsize < 2;
my $savepos = sysseek $fh, 0, 1; # salviamo pos. corr.
my $chunk;
my $chunk_size = LINE_GUESS;
my $rc;
my $result = 0;
my $currpos = $fsize - 1 ; # ignoriamo ultimo car.
while( $currpos > 0 )
{
        if( $currpos > LINE_GUESS ){ $currpos -= LINE_GUESS; } else {
$chunk_size = $currpos; $currpos = 0;}
        sysseek $fh, $currpos, 0  ;
        $fh->sysread( $chunk, $chunk_size );
        $rc = rindex( $chunk, "\n" );
        if( $rc >= 0 ){ $result = $currpos + $rc + 1; last;}
}
sysseek( $fh, $savepos, 0 ); # ripristiniamo pos.
return $result ;
}
Grazie

 Ciao
Ciao,
-- 
+--------+ ASCII ribbon campaign ( )
|  kral  |  - against HTML email  X 
+--------+              & vCards / \

file?
Per come lo usi tu, direi di sě. Fornisce un'interfaccia ad oggetti per i
filehandle. Se vuoi eliminarlo, basta che sostituisci i metodi con chiamate
alle funzioni di base: "open $fh, $arg;" al posto di "$fh =
$file->new($arg);", "sysread $fh, $chunk, $chunk_size" al posto di
"$fh->sysread($chunk, $chunk_size)", ecc. Se l'operazione abbia un qualche
senso o convenienza nel tuo caso, non sono in grado di dirlo.
Ciao.