Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Optimiert Dateien laden (https://www.delphipraxis.net/36158-optimiert-dateien-laden.html)

Shaman 16. Dez 2004 16:25


Optimiert Dateien laden
 
Hallo zusammen

Mich interessiert, wie man am schnellsten (binäre) Dateien laden kann. Ich dachte mir, am besten gehts wohl, wenn man immer so ein Kilo auf einmal lädt. So etwa stelle ich mir das vor:

Delphi-Quellcode:
const
  BLOCK_SIZE = 1024;

function LoadFile(const FileName: string; out Data: PChar): Int64;
var
  Handle: Integer;
  Size: Int64;
  BytesRead: Integer;
  P: PChar;
begin
  Data:= nil;
  Result:= -1;
  Handle:= FileOpen(FileName, fmOpenRead or fmShareDenyWrite);
  if Handle <> -1 then
  try
    Size:= GetFileSize(FileName);
    GetMem(Data, Size);
    try
      P:= Data;
      repeat
        BytesRead:= FileRead(Handle, P^, BLOCK_SIZE);
        Inc(P, BytesRead);
      until BytesRead = 0;
      Result:= Size;
    except
      FreeMem(Data, Size);
      Data:= nil;
    end;
  finally
    FileClose(Handle);
  end;
end;
Was meint ihr dazu?

Gruss
Shaman

Union 16. Dez 2004 16:34

Re: Optimiert Dateien laden
 
Delphi-Quellcode:
until BytesRead = 0;
Sollte besser heissen
Delphi-Quellcode:
until BytesRead < BLOCK_SIZE;
Sonst liest Du nach dem letzten Block nochmal ein, falls die Dateigröße nicht ohne Rest durch BLOCK_SIZE teilbar ist.

tommie-lie 16. Dez 2004 16:57

Re: Optimiert Dateien laden
 
Zitat:

Zitat von Shaman
am besten gehts wohl, wenn man immer so ein Kilo auf einmal lädt.

Als Aufschnitt oder am Stück? :mrgreen:

Ja, im Prinzip ist's so besser als wenn du jedes byte einzeln einliest, die Blockgröße hängt aber vom Dateisystem und der sonstigen Umgebung (konkurrierende Zugriffe auf die Festplatte, konkurrierende Zugriffe auf die gleiche Datei, etc) ab. In dem Fall könntest du sogar die gesamte Datei auf einmal einlesen, da du alle Daten haben willst und linear liest. Bei zufälligem Lesen oder wiederholtem Lesen von kleinen Datenmengen bietet sich aber ein größerer Puffer an.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz