Thema: Delphi Datei byteweise einlesen

Einzelnen Beitrag anzeigen

Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#10

Re: Datei byteweise einlesen

  Alt 12. Mai 2009, 12:03
wenn die gelesene blockgröße gleich der zu lesenden Recordgröße ist, sind die beschriebenen Methoden sehr, sehr langsam. Um viele Faktoren.
Der zu verwendente Lesepuffer sollte bei heutigen Festplatten schon sehr groß sein, 64 kb ist eine angenehme Größe.
Deshalb sollte man also mit einer großen Buffersize lesen und dann müsste man noch umständlich diesen Großen Block auf mehrere Deiner Records aufteilen. Bei diesem Verfahren sollte dann zusätzlich noch die zu lesende Buffersize ein Vielfaches der zu lesenden RecordSize sein, damit es keine Überschneidungen an den Blockgrenzen geben kann, in diesem Falle wird es dann nämlich noch komplizierter.

Das alles kann man sehr einfach haben und sich das nachdenken sparen, wenn man eine Kombination aus TFilestream und TReader verwendet. TReader kann das alles schon selbst.

also quasi sowas:

Delphi-Quellcode:
const
  BufferSize = $10000; // 65536; 64 kb


function LoadFromFile(const aFileName : String) :Integer;
var
  f : TFileStream;
  r : TReader;
  i : Integer;
  myRecord : TMyRecord;
  recSize : Integer;
begin
  Result:=0;
  recSize := SizeOf(TMyRecord);
  f:=TFileStream.Create( aFilename , fmOpenRead or fmShareDenyWrite);
  try
    r:=TReader.Create(f ,BufferSize);
    try

      for i:=0 to (f.Size Div recSize) -1 do
        r.Read(myRecord , recSize );

        ... // myRecord verarbeiten

        Inc(Result);
      end;
    finally
      r.Free;
    end;
  finally
    f.Free;
  end;
end;
siehe hier nochmal auch: http://delphi.pjh2.de/articles/files/files.php
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat