Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Festplattencache planen (https://www.delphipraxis.net/103353-festplattencache-planen.html)

gsh 14. Nov 2007 18:12


Festplattencache planen
 
Hi Leute

Ich will in meinem Programm einen Festplattencache integrieren. So nun wie mach ich den des jetzt am besten ist die Frage.

Ich hab mir zwar schon was überlegt bin aber noch nicht ganz zufrieden mit meiner idee und jetzt wollt ich mal euch fragen was ihr da so macht/machen würdet.

mkinzler 14. Nov 2007 18:12

Re: Festplattencache planen
 
Warum das?

gsh 14. Nov 2007 18:50

Re: Festplattencache planen
 
Weil ich die daten von der festplatte puffern möchte damit falls mal für kurze zeit die festplatte ausgelastet ist immer noch daten zur verfügung stehen warum sonst???

Reinhard Kern 14. Nov 2007 18:55

Re: Festplattencache planen
 
Zitat:

Zitat von gsh
Hi Leute

Ich will in meinem Programm einen Festplattencache integrieren. So nun wie mach ich den des jetzt am besten ist die Frage.

Ich hab mir zwar schon was überlegt bin aber noch nicht ganz zufrieden mit meiner idee und jetzt wollt ich mal euch fragen was ihr da so macht/machen würdet.

Hallo,

einfach NICHTS. I/O-Buffering, Caching etc. etc. werden vom Betriebssystem Windows verwaltet und GEMEINSAM optimiert - jeder Eingriff von Userseite kann die Leistung des Gesamtsystems nur verschlechtern.

Das ist nicht nur die Meinung von MS, sondern auch der meisten Fachleute, auch meine, und das liegt nicht daran, dass MS so genial ist, sondern dass grundsätzlich das BS am besten weiss, was mit dem Speicher anzufangen ist; insofern gilt das auch für jedes andere BS, das überhaupt eine Speicherverwaltung hat.

Am besten anstatt Caching sind Memory Mapped Files zu verwenden - aus Sicht des Programmierers ist alles im Speicher, was aktuell geladen wird, bestimmt das BS.

Gruss Reinhard

gsh 14. Nov 2007 18:58

Re: Festplattencache planen
 
naja aber windows weiß ja nicht was ich mit der datei machen möchte.

aber Memory Mapped Files klingt eigentlich ganz interessant. Mal schaun was ich in der suche drüber finde

Muetze1 14. Nov 2007 19:12

Re: Festplattencache planen
 
Zitat:

Zitat von gsh
naja aber windows weiß ja nicht was ich mit der datei machen möchte.

Du kannst es aber Windows mitteilen - und dieses passt dann entsprechend sogar seinen Cache-Algorithmus darauf an. Siehe dazu auch CreateFile() und dort die zusätzlichen Flags:

FILE_FLAG_WRITE_THROUGH, FILE_FLAG_SEQUENTIAL_SCAN, FILE_FLAG_RANDOM_ACCESS, FILE_FLAG_OVERLAPPED, FILE_FLAG_OPEN_NO_RECALL und FILE_FLAG_NO_BUFFERING.

Dabei hat FILE_FLAG_OVERLAPPED nur einen Nebeneffekt in Bezug auf den Cache.

gsh 14. Nov 2007 19:18

Re: Festplattencache planen
 
ah cool

kann ich des mit TFileStream auch verwenden? Des wär mir lieber

Muetze1 14. Nov 2007 19:20

Re: Festplattencache planen
 
Zitat:

Zitat von gsh
kann ich des mit TFileStream auch verwenden? Des wär mir lieber

Jain. Leite von THandleStream ab und bau die Flags mit ein. Dann hast du mit einem neuen Constructor deinen FileStream mit deinen Flags...

gsh 14. Nov 2007 20:44

Re: Festplattencache planen
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von gsh
kann ich des mit TFileStream auch verwenden? Des wär mir lieber

Jain. Leite von THandleStream ab und bau die Flags mit ein. Dann hast du mit einem neuen Constructor deinen FileStream mit deinen Flags...

ahm des mag ich überhaupt nicht

geht es nicht z.b. über TFileStream.Create(const AFileName: string; Mode: Word; Rights: Cardinal);

Muetze1 14. Nov 2007 21:23

Re: Festplattencache planen
 
Zitat:

Zitat von gsh
ahm des mag ich überhaupt nicht

Und was stört dich daran?

Zitat:

Zitat von gsh
geht es nicht z.b. über TFileStream.Create(const AFileName: string; Mode: Word; Flags: word);

Aber genau sowas kannst du dir doch bauen damit:

Delphi-Quellcode:
  TFlagFileStream = Class(THandleStream)
  Public
    Constructor Create(const FileName: string; const AMode: word);
    Destructor Destroy; Override;
  End;

...

constructor TFlagFileStream.Create(const FileName: string; const Mode: word; Flags: Word)
var
  lHandle: THandle;
begin
  if AMode = fmCreate then
  begin
    lHandle := CreateFile(PChar(FileName), GENERIC_READ Or GENERIC_WRITE,
                                    0, Nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL or Flags, 0);

    if lHandle < 0 then
      raise EFCreateError.CreateResFmt(PResStringRec(@SFCreateError), [FileName]);
  end
  else
  begin
    lHandle := CreateFile(PChar(FileName), GENERIC_READ Or GENERIC_WRITE,
                                    0, Nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or Flags, 0);

    if lHandle < 0 then
      raise EFOpenError.CreateResFmt(PResStringRec(@SFOpenError), [FileName]);
  end;

  inherited Create(lHandle);
end;

destructor TFlagFileStream.Destroy;
begin
  FileClose(Handle);

  inherited;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 Uhr.
Seite 1 von 2  1 2      

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