Meine letzte Frage (Geschwindigkeitsoptimierung) wurde bestens beantwortet.
Nun habe ich ein anderes Problem, das Fragen aufwirft.
Ich habe eine Routine, bei der ich blockweise die Daten aus einer Datei lese. Alles wunderbar, solange die Datei kleiner 1-2MB ist.
Sind die Dateien größer ist die Geschwindigkeit unterschiedlich.
Einmal wird alles fix ausgelesen (z.B. 5500 Durchläufe des unteren Codes in weniger als 1 Sekunde), beim nächsten mal dauert es ewig. Das heisst, wenn ich nach 10 Sekunden einen Haltepunkt setze, wurden erst ca 900 Durchläufe durchgeführt.
Hier ist die Record-Definition:
Delphi-Quellcode:
TMessageBlockHeader = record
Address: cardinal;
BlockLength: cardinal;
TextLength: cardinal;
NextBlockAddress: cardinal;
end;
Hier die Routine:
Delphi-Quellcode:
procedure xyz.GetData(address: cardinal; var MyStream: TStringStream);
var
FFileHandle: TFileStream;
BlockHeader: TMessageBlockHeader;
block: TStringStream;
Schleife : Cardinal;
begin
FFileHandle := TFileStream.Create('C:\test.bin', fmOpenRead or fmShareDenyNone); //fmShareDenyWrite);
Schleife := 0;
While True do
begin
if address = 0 then
break;
inc(Schleife); // zum Zählen der Durchläufe
FFileHandle.Seek(address, soFromBeginning);
FFileHandle.Read(BlockHeader, sizeof(BlockHeader));
if address = BlockHeader.Address then
begin
if (BlockHeader.TextLength > 0) and
(BlockHeader.TextLength <= BlockHeader.BlockLength) then
begin
block := TStringStream.Create('');
try
block.CopyFrom(FFileHandle, BlockHeader.TextLength);
MyStream.WriteString(block.DataString);
finally
block.Free;
end;
// if ((BlockHeader.NextBlockAddress > 0)
// and (BlockHeader.NextBlockAddress <= address)) then
// break;
address := BlockHeader.NextBlockAddress;
end;
end; // if
end;//while
MessageBox(0, PChar('Schleifen: ' + IntToStr(Schleife)), 'Caption', MB_OK + MB_ICONINFORMATION);
end; // if
if FFileHandle <> nil then
FFileHandle.Free;
end;
Ich habe mal etwas gelesen, dass Seek nicht immer gleich arbeitet. Was kann man dagegen tun?
Danke für jede Hilfe. Ich hoffe, mich kann jemand erleuchten