Schnelles Lesen / Schreiben aus Datei in Delphi

8

Ich lade eine Datei in ein Array in binärer Form, das scheint eine Weile zu dauern Gibt es einen besseren, schnelleren, effizienteren Weg, dies zu tun? Ich verwende eine ähnliche Methode für das Zurückschreiben in die Datei.

%Vor%     
Arthur 18.01.2009, 19:57
quelle

6 Antworten

15

Sie sollten Dateien nicht Byte für Byte lesen. Verwenden Sie BlockRead mit einem größeren Wert (512 oder 1024 sind oft am besten) und verwenden Sie den Rückgabewert, um herauszufinden, wie viele Bytes gelesen wurden.

Wenn die Größe nicht zu groß ist (und Ihre Verwendung von SetLength scheint dies zu unterstützen), können Sie auch einen BlockRead-Aufruf verwenden, bei dem die gesamte Datei gleichzeitig gelesen wird. Wenn Sie also Ihren Ansatz ändern, wäre dies:

%Vor%

Vielleicht könnten Sie die Prozedur auch in eine boolesche Funktion namens OpenAndReadFile ändern und false zurückgeben, wenn die Datei nicht geöffnet oder gelesen werden konnte.

    
schnaader 18.01.2009, 20:03
quelle
16

Wenn Sie eine Binärdatei wirklich schnell lesen wollen, lassen Sie Windows sich Gedanken über die Pufferung machen ;-) mit Speicherzugewiesene Dateien . Damit können Sie eine Datei einfach an einen Speicherort ablegen und sie lesen, als wäre es ein Array.

Ihre Funktion wäre:

%Vor%

Aber ich würde vorschlagen, die globale Variable dataarray nicht zu verwenden, sondern sie entweder als Var im Parameter zu übergeben oder eine Funktion zu verwenden, die das resultierende Array zurückgibt.

%Vor%

Die TMappedFile stammt aus meinem Artikel Fast Lesen von Dateien mit Memory Mapping , dieser Artikel enthält auch ein Beispiel, wie man es für "fortgeschrittenere" Binärdateien verwenden kann.

    
Davy Landman 19.01.2009 08:17
quelle
5

Das hängt vom Dateiformat ab. Wenn es aus mehreren identischen Datensätzen besteht, können Sie eine Datei dieses Datensatztyps erstellen.

Zum Beispiel:

%Vor%     
Toon Krijthe 18.01.2009 20:38
quelle
2

Wenn es eine Datei ist, die lange genug ist, dass das Lesen auf diese Weise eine merkliche Menge an Zeit benötigt, würde ich stattdessen einen Stream verwenden. Der gelesene Block wird viel schneller sein, und es gibt keine Schleifen, über die man sich Sorgen machen muss. Etwas wie das:

%Vor%

Aus Ihrem Code geht hervor, dass Ihre Datensatzgröße 1 Byte lang ist. Wenn nicht, ändern Sie die Leseleitung zu:

%Vor%

oder etwas ähnliches.

    
Mason Wheeler 19.01.2009 05:49
quelle
0

Suchen Sie nach einem gepufferten TStream-Nachkommen. Es macht Ihren Code viel schneller, da das Lesen der Festplatte schnell erfolgt, aber Sie können den Puffer problemlos durchlaufen. Es gibt verschiedene, oder Sie können Ihre eigenen schreiben.

    
mj2008 19.01.2009 09:32
quelle
0

Wenn Sie sich sehr benommen fühlen, können Sie Win32 umgehen und die NT-Native-API-Funktion ZwOpenFile () aufrufen, die bei meinen informellen Tests ein kleines bisschen abrasiert. Ansonsten würde ich Davys Memory Mapped File-Lösung oben verwenden.

    
Jesse C. Slicer 19.01.2009 16:41
quelle

Tags und Links