Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#1

ReadFileScatter/WriteFileGatter

  Alt 20. Dez 2006, 13:47
Moin,

ist zufällig in Sachen ReadFileScatter jemand weitergekommen?


Denn nach meinem Testprogramm bringt dieses anscheinend "nur" Nachteile.


Es ist ja schließlich nicht schneller als ein "normales" asynchrones und noncached ReadFile,
nur daß man erst den Speicher "mühevoll" in kleine Häppchen (je 1x SystemPageSize) zerlegen muß.

Und wenn genügend Teile bereits in der WindowsFileCache liegen, dann sind die "langsamen", darüber laufenden Funktionen schneller.
z.B. die über 700 MB/s, bei zwei 128 MB-Dateien sind ja wohl nicht zu verachten...


Im Anhang natürlich mein Testprojektchen,
zusammen mit den anderen Lese-Methoden.


PS:
laut meinem PSDK (WinXP SP2) soll FILE_SEGMENT_ELEMENT angeblich so aussehen:
Code:
typedef union _FILE_SEGMENT_ELEMENT {
    PVOID64 Buffer;
    ULONGLONG Alignment;
} FILE_SEGMENT_ELEMENT;
Delphi-Quellcode:
Type FILE_SEGMENT_ELEMENT = packed Record
    Buffer: Pointer64;
    Alignment: UInt64;
  End;
wie man sieht is alles 64 Bit groß, weßhalb ich es so definiert hatte:
Delphi-Quellcode:
Type FILE_SEGMENT_ELEMENT = packed Record
    Buffer, _fill: Pointer;
    Alignment: UInt64;
  End;
allerdings funktioniert es nur, wenn 32 Bit verwendet wird:
(wenn mehr als eine SystemPageSize gelesen werden soll)
Delphi-Quellcode:
Type FILE_SEGMENT_ELEMENT = packed Record
    Buffer: Pointer;
    Alignment: LongWord;
  End;

PSS:
Wenn zufällig noch jemand weiß wofür Alignment da sein soll?
Es hatte bei mir jedenfalls keine Auswirkungen und wenn MS was im Record freilassen wollte, dann heißt es ja sonst reserved, oder so.
Im PSDK steht zumindestens nichts drin.



[Anhang]
ClearCache: da ich ja keinen "direkten" einfluß auf die WindowsateiVerwaltung hab, kann/wird dieses vermutlich nicht bei jedem funktionieren ... als Ausweg könnte man auch den Rechner in den Ruhezustand (Hibernate) versetzen, denn da wird ebenfalls de FileCache geleert.

Im Bild sieht man verschiedene Testläufe, unter verschiedenen Bedingungen...
> mit FileCache
> mit FileCache - Dateien bereits geladen
> ohne FileCache

> auf dem selben Datenträger
> auf physich getrennten Datenträgern

Dann wurden noch die im Durchschitt besten Lese-Methoden angepunktet (markiert).


PS: wenn versucht wird gleichzeitig auf dem selben Laufwerk Dateien zu lesen/schreiben, dann wird natülich durch das ständige hin- und herspringen (zwischen den Dateien) alles ausgebremst.


[add]
Ich vergaß noch zu sagen, daß in den Sourcen keine Resourcenschutzblöcke und Fehlerabfragen vorhanden sind.
Für die kleine Demo werden diese nicht benötigt und würden wohl eher die Übersichtlichkeit über das Wichtigste behindern.
Wer also was daraus verwenden will, sollte sich dann die entsprechenden Dinge noch unbedingt einbauen!
Miniaturansicht angehängter Grafiken
readfilescatter_111.jpg  
Angehängte Dateien
Dateityp: zip readfilescatter_994.zip (155,6 KB, 17x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat