Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: frandell - Aprile 02, 2013, 01:07:26 pm

Titolo: Filestream per leggere un file
Inserito da: frandell - Aprile 02, 2013, 01:07:26 pm
Salve a tutti,

Sto cercando di realizzare una specie di parser in grado di leggere un file di testo una riga per volta e confrontarlo con il contenuto di un altro file di testo contenente alcune regole. Quando viene trovato il match della riga con una regola viene scritto su un file xml.
Per file piccoli funziona ed è anche abbastanza veloce. La parte di codice che fa il lavoro da me descritto è la seguente:
Codice: [Seleziona]
procedure TGUI_Parser.ManeggiaLog(const txt: String);
var myFile : TextFile;
myStringa, myOre, myMinuti, mySecondi, mySubStr: Ansistring;
m: integer;
FlagCapt, FlagNew, FlagReal, FlagAlr: boolean;
begin
  AssignFile(myFile,txt);
  Reset(myFile);
  Visualizzatore.Append('Leggo Log File: '+txt);
  StringaCapt_o :='';
  StringaId_o :='';
  RealTime_o := '';
  CpuTime_o := '';
  FlagCapt := False;
  FlagNew := False;
  FlagReal := False;
  SetLength(StringaVett,3500000);
  k:=0;
  while not Eof(myFile) do
  begin
    FlagCapt := False;
    FlagAlr := False;
    StringaCapt_o:=MyDeclare.StringaCapt;
    StringaId_o:=MyDeclare.StringaId;
    RealTime_o:=MyDeclare.RealTime;
    CpuTime_o:=MyDeclare.CpuTime;
    ReadLn(myFile,myStringa);
    ...
  end;

Purtroppo mi può capitare di maneggiare file di qualche centinaio di MB e in questo caso sto cercando di utilizzare il Filestream per fare lo stesso lavoro ma sembra che per come l'ho implementato io (codice di seguito) non riesca a leggere le righe allo stesso modo.

Codice: [Seleziona]
procedure TGUI_Parser.ManeggiaLog(const txt: String);
var //myFile : TextFile;
Reader : TFileStream;
myStringa, myOre, myMinuti, mySecondi, mySubStr: Ansistring;
m,index,bufferleng: integer;
FlagCapt, FlagNew, FlagReal, FlagAlr: boolean;
begin
  //AssignFile(myFile,txt);
//  Reset(myFile);
  Visualizzatore.Append('Leggo Log File: '+txt);
  StringaCapt_o :='';
  StringaId_o :='';
  RealTime_o := '';
  CpuTime_o := '';
  FlagCapt := False;
  FlagNew := False;
  FlagReal := False;
  bufferleng := 32768;
  k:=0;
  SetLength(StringaVett,3500000);
//  while not Eof(myFile) do
  try
    Reader := TFileStream.Create(txt,fmOpenRead);
    FlagCapt := False;
    FlagAlr := False;
    StringaCapt_o:=MyDeclare.StringaCapt;
    StringaId_o:=MyDeclare.StringaId;
    RealTime_o:=MyDeclare.RealTime;
    CpuTime_o:=MyDeclare.CpuTime;
    Index := 0;
    MyStringa := '';
    Reader.Seek(Index,soFromBeginning);
    SetLength(MyStringa,bufferleng);
    Reader.Read(MyStringa,Index);                       
    ...
    Index := Index + bufferleng;
  finally
    Reader.Free;
  end;       
   

Non riesco a capire cosa ci sia che non vada bene. Potete aiutarmi per favore?

Grazie mille.

Francesco
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 02, 2013, 01:19:23 pm
Codice: [Seleziona]
 Reader.Read(MyStringa,Index);                     
Prova
Codice: [Seleziona]
 Reader.Read(MyStringa[1],Index);                     
Dimmi se funziona ;)
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 02, 2013, 01:24:09 pm
Ciao Stilgar e grazie per la gentile risposta ma purtroppo il risultato non cambia  :(
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 02, 2013, 01:36:36 pm
Allora mi sfugge il problema ...
Leggi la stringa sempre alla stessa posizione....
Codice: [Seleziona]
    SetLength(MyStringa,bufferleng);
    Reader.Read(MyStringa,Index);     

A occhio e crocie quello che leggi è una parte del file.
Se leggi 3 volte, leggi nella posizinoe 3 blocchi del file.
Quindi :
1) Leggi tutto lo stream in un colpo solo.
2) Sposti l'indice di scrittura della stringa.

Ma forse non ho capito il problema e sto andando a margherite...
Stilgar
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 02, 2013, 02:15:28 pm
Penso di star leggendo il file a 32768 byte per volta, avendo fissato bufferleng a tale valore e incrementando la Index ogni volta.

Adesso ho spostato fuori dal blocco try l'assegnazione "Index := 0" ma il risultato è lo stesso.
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 02, 2013, 02:21:44 pm
Ho spostato adesso l'incremento della variabile Index tra la Seek e la SetLength ma il risultato ancora non cambia
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 02, 2013, 02:30:23 pm
Continua a sfuggirmi il problema ...
Con il primo listato readln leggeva fino al primo #13 ...
Ora leggi tutto + o - in un colpo solo ...
Allora hai pensato all'uso di una string list?
Così legge lei al posto tuo le stringhe.
Poi con il la propretry Text (vado a memoria) hai tutto il file carcicato in memoria.
E' un PChar, per cui il tuo parser ragionerebbe in termini di putatore e non stringa...
Stilgar
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 02, 2013, 02:44:00 pm
Ho pensato all'uso della TStringList (che peraltro ho usato per leggere il file delle regole con le proprietà Name e ValueFromIndex) ma avevo letto che il FileStream è molto più veloce per leggere i file grandi, perciò ho usato quello.
Dici che lo sto usando in modo improprio, leggendo il file tutto insieme anziché una stringa per volta?
Grazie ancora.
Francesco
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 02, 2013, 03:22:37 pm
Dipende da cosa ne devi fare ... lo stream è una cosa, ma se devi lavorare in termini di stringhe ... forse è più semplice lavorare con la struttura che ti serve.
Poi ti concentri sulla lettura via stream.... ;)

Stilgar
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 02, 2013, 03:40:37 pm
Decisamente devo lavorare in termini di stringhe. Pensavo che quello che avessi implementato all'inizio fosse il modo più efficiente ma alla fine, utilizzando la stringa di appoggio (invece anche della TStringList), per elaborare file di 800 MB l'applicazione impiega ore.
Pensi che usando la TStringList per appoggiarvi le righe del file da 800 MB l'elaborazione potrebbe essere più efficiente?
Grazie per l'aiuto ancora.
Francesco
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 02, 2013, 04:10:21 pm
Urca ... allora ti conviene leggere e parsare subito ...
Non caricare e parsare in tempi separati.
Passi uno stream al parser e con quello lavori.
Poi che lo stream sia un file stream o un memory stream, poi al parser non cambia la famosa beata fava ;)

Stilgar
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 02, 2013, 04:37:42 pm
Ehm, scusami Stilgar, ma non è quello che stavo facendo io?
Nel frattempo ho cambiato qualche riga, ma l'effetto è sempre lo stesso.
Riscrivo il codice come nella mia ultima modifica. Grazie di nuovo per la tua disponibilità e la tua gentilezza.

Codice: [Seleziona]
procedure TGUI_Parser.ManeggiaLog(const txt: String);
var //myFile : TextFile;
Reader : TFileStream;
myStringa, myOre, myMinuti, mySecondi, mySubStr: Ansistring;
m,index,bufferleng: integer;
FlagCapt, FlagNew, FlagReal, FlagAlr: boolean;
begin
  //AssignFile(myFile,txt);
//  Reset(myFile);
  Visualizzatore.Append('Leggo Log File: '+txt);
  StringaCapt_o :='';
  StringaId_o :='';
  RealTime_o := '';
  CpuTime_o := '';
  FlagCapt := False;
  FlagNew := False;
  FlagReal := False;
  bufferleng := 32768;
  k:=0;
  SetLength(StringaVett,3500000);
  Index := 0;
  try
    Reader := TFileStream.Create(txt,fmOpenRead);
    FlagCapt := False;
    FlagAlr := False;
    StringaCapt_o:=MyDeclare.StringaCapt;
    StringaId_o:=MyDeclare.StringaId;
    RealTime_o:=MyDeclare.RealTime;
    CpuTime_o:=MyDeclare.CpuTime;
    MyStringa := '';
    while Index < Reader.Size do
    begin
     Reader.Seek(Index,soFromBeginning);
     Index := Index + Bufferleng;
     SetLength(MyStringa,bufferleng);
     Reader.Read(MyStringa,bufferleng);
     ...
     finally
    Reader.Free;
  end;     
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 02, 2013, 05:09:31 pm
Frandell... questo è solo un ciclo di lettura ... vedendo questo codice mi viene da pensare che leggi e parsi.

Quello che dicevo io era più del tipo:
Codice: [Seleziona]
procedure parse(const s : TStream);
var
  c : Char;
  accumulo : String;
begin
  while s.read(C,SizeOf(C)) < SizeOf(C) do
  begin
     if C  <> #32 then { o #13 o #10 o altri separatori di comodo }
       accumulo := accumulo +C;
    else
    begin
      { qualche cosa legata al parser }
    end;
  end;
end;
Tu leggi un blocco e poi lo interpreti.

Stilgar
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 02, 2013, 05:18:59 pm
Ti chiedo ancora scusa, forse sono io che ci sto capendo poco, o sarà per la mia inesperienza.
Ma con l'istruzione "Reader.Read(MyStringa,bufferleng);" non gli sto dicendo che ne leggo un blocco di lunghezza=bufferleng e poi lo parso? A me sembra così...
Grazie anche per la pazienza  :D
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 02, 2013, 05:26:39 pm
Ripartiamo allora.
Cosa c'è che non va?
La lettura, come la fai tu, non è corretta.
Per le stringhe non puoi caricare di botta N byte.
Le stringhe in Pascal hanno il "primo" carattere che è vincolato e utilizzato dal compilatore.
Che siano stringhe open o meno il compilatore ti impedisce di scrivere sul carattare [ 0 ]
Se carichi la stringa omettendo [1] carichi dalla posizione [ 0 ]. Quindi metti in crisi il sistema di gestione delle stringhe.
 
Citazione
ma sembra che per come l'ho implementato io (codice di seguito) non riesca a leggere le righe allo stesso modo.
Poi altro non posso dirti se non mi spieghi cosa non va.
Se mi dici cosa vedi nel debugger forse c'è qualche possibilità che le indicazoni siano un attimino meno generiche ;)

Stilgar

Titolo: Re:Filestream per leggere un file
Inserito da: nomorelogic - Aprile 02, 2013, 05:36:48 pm
visto che si tratta di un log, le stringhe hanno tutte la stessa lunghezza?
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 02, 2013, 05:49:01 pm
Non mi dà errore a runtime ma non riesce a leggermi la myStringa. E alcuni tra i tag xml del file di output sono vuoti
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 03, 2013, 09:53:33 am
Hai provato a scrivere un file con il contenuto letto dallo stream?
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 03, 2013, 10:06:05 am
x nomorelogic: per stringhe intendi le righe del file? In tal caso non hanno la stessa lunghezza.
x stilgar: grazie per il suggerimento, provo subito e faccio sapere
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 03, 2013, 10:33:34 am
Dimenticavo: comunque scrivevo myStringa su un TMemo e ottenevo solo una interminabile serie di ?
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 03, 2013, 10:37:56 am
Leggevi ma depositavi a casaccio in memoria.
Come ti dicevo devi far puntare al primo carattere valido myString[1] ... e non myString

Stilgar
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 03, 2013, 10:48:09 am
Grazie mille ancora, Stilgar.

Ho seguito il tuo suggerimento, sostituendo myStringa[1] a myStringa nella chiamata della read e adesso ottengo il seguente errore a runtime:

"Il progetto MyParser ha sollevato una eccezione di classe 'EConvertError' con messaggio: "" is an invalid float.
At address 4564A2".

Adesso provo a capire qualcosa di più
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 03, 2013, 11:12:48 am
StrToFloat("") ...
dall'errore c'è qualche cosa di simile ;)
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 03, 2013, 11:31:34 am
Niente, ora è un po' più chiaro. Purtroppo sto caricando 32K per volta in MyStringa e tento di parserizzare: ed è questo l'errore perché la logica del programma che ho implementato ragiona sulla singola riga. Mi chiedo comunque una cosa: se leggo in filestream una riga per ogni blocco ottengo un guadagno in termini di tempo? E' questo quello che vorrei capire meglio.
Intanto ringrazio Stilgar ancora perché è stato molto paziente con uno come me che ha ancora molti problemi di base
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 03, 2013, 11:33:13 am
Prendi spunto dall'ultimo pezzo di codice che ti ho postato.
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 03, 2013, 11:37:06 am
Grazie ancora. Non lo avevo preso in considerazione prima perché non lo capivo in quanto mi era sfuggita proprio la prima riga, quella in cui dichiari s in input come stream. Scusami ancora  :)
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 04, 2013, 12:11:00 pm
Ciao e scusate di nuovo.
Come da suggerimento di Stilgar ho provato a modificare il codice in questo modo:

Codice: [Seleziona]
procedure TGUI_Parser.ManeggiaLog(const txt: String);
var //myFile : TextFile;
Reader : TFileStream;
myStringa, myOre, myMinuti, mySecondi, mySubStr: Ansistring;
c : char;
m, Index: integer;
//,index,bufferleng
FlagCapt, FlagNew, FlagReal, FlagAlr: boolean;
begin
  //AssignFile(myFile,txt);
//  Reset(myFile);
  Visualizzatore.Append('Leggo Log File: '+txt);
  StringaCapt_o :='';
  StringaId_o :='';
  RealTime_o := '0';
  CpuTime_o := '0';
  FlagCapt := False;
  FlagNew := False;
  FlagReal := False;
  //bufferleng := 32768;
  k:=0;
  SetLength(StringaVett,3500000);
  Index := 0;
  try
    Reader := TFileStream.Create(txt,fmOpenRead);
    FlagCapt := False;
    FlagAlr := False;
    StringaCapt_o:=MyDeclare.StringaCapt;
    StringaId_o:=MyDeclare.StringaId;
    RealTime_o:=MyDeclare.RealTime;
    CpuTime_o:=MyDeclare.CpuTime;
    myStringa := '';
    while Index < Reader.Size do
     begin
      Reader.read(c,sizeof(c));
      Visualizzatore.Append('Valore di C '+c);
      if (C <> #13) or (C <> #10) then
       begin
        myStringa := myStringa + C;
        ...
        myStringa := ''; //per reinizializzare la stringa una volta andato a capo
      end;
finally
    Reader.Free;
  end;

L'ho lanciato da due ore e mezza ed è ancora in esecuzione (ammesso che vada bene). Speravo di potermela cavare con molto meno. Potete per favore suggerirmi qualcosa per renderlo più veloce?
Grazie in anticipo e scusatemi ancora.
Fra
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 04, 2013, 12:13:24 pm
Codice: [Seleziona]
 Visualizzatore.Append('Valore di C '+c); 
Visualizzatore .... cosa è?

Stilgar

PS:
Index????? Cosa è ??
Lo sposti?
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 04, 2013, 12:20:24 pm
Ehm hai ragione...
Visualizzatore è il TMemo.

Quanto ad Index...mannaggia a quanto sono sbadato certe volte!!!
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 04, 2013, 12:22:53 pm
Allora ... il memo ... metti un beginUpdate e un endUpdate. (Altrimenti rallenti con l'update e render a video).
Ogni 2000 caratteri metti un application.ProcessMessage.
In questo modo fai andare avanti anche i messaggi e l'applicazione non da quel fastidioso senso di "blocco".
Stilgar
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 04, 2013, 03:36:09 pm
Grazie ancora per i validi suggerimenti, Stilgar.

Il codice è diventato questo:

Codice: [Seleziona]
procedure TGUI_Parser.ManeggiaLog(const txt: String);
var
Reader : TFileStream;
myStringa, myOre, myMinuti, mySecondi, mySubStr: Ansistring;
c : char;
m, Index: integer;
FlagCapt, FlagNew, FlagReal, FlagAlr: boolean;
begin
  Visualizzatore.Append('Leggo Log File: '+txt);
  StringaCapt_o :='';
  StringaId_o :='';
  RealTime_o := '0';
  CpuTime_o := '0';
  FlagCapt := False;
  FlagNew := False;
  FlagReal := False;
  k:=0;
  SetLength(StringaVett,3500000);
  Index := 0;
  try
    Reader := TFileStream.Create(txt,fmOpenRead);
    FlagCapt := False;
    FlagAlr := False;
    StringaCapt_o:=MyDeclare.StringaCapt;
    StringaId_o:=MyDeclare.StringaId;
    RealTime_o:=MyDeclare.RealTime;
    CpuTime_o:=MyDeclare.CpuTime;
    myStringa := '';
    while Index < Reader.Size do
     begin
      Reader.read(c,sizeof(c));
      if (C <> #13) or (C <> #10) then
       begin
        myStringa := myStringa + C;   
        ...
       end;
     myStringa := '';
     Index := Index + Sizeof(c);
     Reader.Seek(Index,soFromBeginning);
    end;
  finally
    Reader.Free;
  end;
  If Index mod 2000 = 0 then
   Application.ProcessMessages;
end;

Purtroppo è ancora un po' troppo lento... :(
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 04, 2013, 03:38:26 pm
Codice: [Seleziona]
procedure TGUI_Parser.ManeggiaLog(const txt: String);
var
Reader : TFileStream;
myStringa, myOre, myMinuti, mySecondi, mySubStr: Ansistring;
c : char;
m, Index: integer;
FlagCapt, FlagNew, FlagReal, FlagAlr: boolean;
begin
  Visualizzatore.Append('Leggo Log File: '+txt);
  StringaCapt_o :='';
  StringaId_o :='';
  RealTime_o := '0';
  CpuTime_o := '0';
  FlagCapt := False;
  FlagNew := False;
  FlagReal := False;
  k:=0;
  SetLength(StringaVett,3500000);
  Index := 0;
  try
    Reader := TFileStream.Create(txt,fmOpenRead);
    FlagCapt := False;
    FlagAlr := False;
    StringaCapt_o:=MyDeclare.StringaCapt;
    StringaId_o:=MyDeclare.StringaId;
    RealTime_o:=MyDeclare.RealTime;
    CpuTime_o:=MyDeclare.CpuTime;
    myStringa := '';
    while Index < Reader.Size do
     begin
      Reader.read(c,sizeof(c));
      if (C <> #13) or (C <> #10) then
       begin
        myStringa := myStringa + C;   
        ...
       end;
     myStringa := '';
     Index := Index + Sizeof(c);
    //     Reader.Seek(Index,soFromBeginning);  inutile se non dannoso ... sei già alla posizione index dall'inizio dello stream.
  If Index mod 2000 = 0 then
   Application.ProcessMessages;
    end;
  finally
    Reader.Free;
  end;
end;

Prova a vedere ...
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 04, 2013, 04:45:48 pm
Grazie ancora, ma dopo aver fatto la prova ho visto che i tempi sono sempre gli stessi...
Francesco
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 04, 2013, 04:48:01 pm
Inizia a prendere i tempi.
Lettura e parsing.

Stilgar
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 04, 2013, 06:54:04 pm
In realtà io leggo e parserizzo una stringa per volta appena acquisita...
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 04, 2013, 08:22:19 pm
Appunto, prendi i tempi di quanto ci metti a leggere e a fare il parsing per riga..
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 04, 2013, 08:26:58 pm
Codice: [Seleziona]
interface
function currentTimeMillis: int64;

implementation
type
  TOS = record
    javaTimeMillis: function: int64;
    javaTimeNanos: function: int64;
  end;

var
  OS: TOS;

{$IFDEF WINDOWS}

function jlong_from(h, l: word): int64;
var
  R: Int64Rec;
begin
  R.Lo := l;
  R.Hi := h;
  Result := int64(r);
end;

function offset(): int64;
var
  java_origin: SYSTEMTIME;
  jot: FILETIME;
begin
  java_origin.wYear := 1970;
  java_origin.wMonth := 1;
  java_origin.wDayOfWeek := 0; // ignored
  java_origin.wDay := 1;
  java_origin.wHour := 0;
  java_origin.wMinute := 0;
  java_origin.wSecond := 0;
  java_origin.wMilliseconds := 0;
  FillChar(jot, SizeOF(jot), 0);
  SystemTimeToFileTime(java_origin, jot);
  Result := jlong_from(jot.dwHighDateTime, jot.dwLowDateTime);
end;

function windows_to_java_time(wt: TFILETIME): int64;
begin
  Result := jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
  Result := (Result - offset()) div 10000;
end;

function javaTimeMillis_md: int64;
var
  wt: TFILETIME;
begin
  GetSystemTimeAsFileTime(wt);
  Result := windows_to_java_time(wt);
end;

const
  NANOS_PER_SEC = 1000000000;
  NANOS_PER_MILLISEC = 1000000;

var
  has_performance_count: int = 0;
  first_filetime: int64;
  initial_performance_count: int64;
  performance_frequency: int64;

function javaTimeNanos_md(): int64;
var
  current_count: TLargeInteger;
  current: double;
  freq: double;
begin
  Result := 0;
  current_count := 0;
  QueryPerformanceCounter(current_count);
  current := current_count;
  freq := performance_frequency;
  Result := Trunc((current / freq) * NANOS_PER_SEC);
end;

procedure initialize_performance_counter();
var
  Count: TLargeInteger;
  wt: TFILETIME;
begin
  if (QueryPerformanceFrequency(Count)) then
  begin
    has_performance_count := 1;
    performance_frequency := Count;
    QueryPerformanceCounter(Count);
    initial_performance_count := Count;
  end
  else
  begin
    has_performance_count := 0;
    GetSystemTimeAsFileTime(wt);
    first_filetime := jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
  end;
end;

{$ENDIF}
function currentTimeMillis: int64;
begin
  Result := OS.javaTimeMillis();
end;

initialization
  initialize_performance_counter;
  os.javaTimeMillis := @javaTimeMillis_md;
  os.javaTimeNanos := @javaTimeNanos_md;

usa questo pezzo di codice per prendere i tempi ;)
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 05, 2013, 09:21:22 am
Grazie mille. Sicuramente dovrò studiarlo perché la mia conoscenza in merito è proprio terra terra...a dir poco...Però ci sarebbe un altro problema: dove lo metto?
Ehm scusami ancora e spero di non approfittare della tua disponibilità...
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 05, 2013, 09:51:06 am
Questi frammenti di codice li puoi mettere dentro una unit a parte.
Sistemalo fintanto non compila.
Questo per un sistema (solo per windows).
Se hai linux ... non va bene ;) Ma è pronto per accogliere anche il codice per linux :D

La funzione resituisce un numero, che rappresenta i millisecondi.

L'uso è da fare in questi termini.
Prenti il tempo prima di un ciclo.
Alla fine del ciclo rilevi nuovamente il tempo.
Sottrai i due valori (secondo-primo) e hai i millisecondi che sono intercorsi nel ciclo.

Non è un "profiler serio", ma aiuta ad orientare gli sforzi di tuning del codice ;)

Stilgar
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 05, 2013, 09:54:02 am
PS: Il codice arriva da una libreria che sto stendendo in questo periodo. ;)
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 05, 2013, 10:28:31 am
Grazie! Lo sto implementando su Windows 7 ma purtroppo sto avendo problemi con i tipi FILETIME e SYSTEMTIME che non sembra riconoscere :(
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 05, 2013, 10:32:56 am
Includi Windows ...
Sono strutture di sistema ...
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 05, 2013, 02:12:03 pm
Ciao Stilgar, ancora grazie.

L'ho lanciato finalmente intorno alle 10.40 ed è ancora in esecuzione...
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 05, 2013, 02:15:17 pm
Hai un log o qualche cosa che ti dia i tempi?
IN modo da capire dove in ferma a loppare?
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 05, 2013, 02:17:26 pm
Purtroppo no, finora non mi è servito. Scrivevo tutto sul memo ma ho tolto parecchi messaggi per velocizzare un po'. Ma con beginupdate e endupdate non avrei dovuto vederli scorrere?
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 05, 2013, 02:19:43 pm
Ni ... se li metti all'inizio e la fine del processo fermi del tutto il processo di aggiornamento video.

BeginUpdate -> Stoppa il "motore di render" per aggiornamenti.
EndUpdate -> Riattiva il "motore di render" per fine aggiornamenti.

Devi intenderli come update del "modello" che vai a rappresentare a video.

Stilgar

Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 05, 2013, 03:39:47 pm
Ehm forse sbaglio a metterli (adesso li ho spostati all'inizio e alla fine del blocco che fa la parserizzazione, cioè quello che ho riportato) ma purtroppo non vedo scorrere i messaggi...
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 05, 2013, 03:49:01 pm
... prova a scrivere in un file ...
Questo rallenterà fisiologicamente l'applicativo, ma potrei verificare meglio le cose.
Non ti propondo di scrivere un thread che pompi i messaggi di paint dell'applicazione principale. ;)

Stilgar
Titolo: Re:Filestream per leggere un file
Inserito da: El Salvador - Aprile 05, 2013, 08:14:16 pm
Ma ora che devi controllare i tempi, non ti conviene lavorare su file piccoli? Riuscirai a capire dove sono i colli di bottiglia e una volta risolti, passare ai file più grandi...
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 08, 2013, 09:38:35 am
Provo così e faccio sapere. Grazie anche a te, El Salvador! ;)
Titolo: Re:Filestream per leggere un file
Inserito da: frandell - Aprile 08, 2013, 09:57:01 am
Niente da fare. E' piuttosto veloce ad elaborare un file di 538 K, ci mette alcuni secondi, ma non riesco a prendere il tempo e non vengono prodotti i dati (vabbe', questo è un altro aspetto su cui devo lavorare un po')
Titolo: Re:Filestream per leggere un file
Inserito da: Stilgar - Aprile 08, 2013, 09:59:07 am
E' veloce e non far nulla?
Fammi capire ....


Stilgar