Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Dateien vegleichen belegt zu viel speicher! (https://www.delphipraxis.net/9770-dateien-vegleichen-belegt-zu-viel-speicher.html)

ATwardz 3. Okt 2003 17:44


Dateien vegleichen belegt zu viel speicher!
 
Hi,

ich benutze folgenden Code um zwei Dateien zu vergleichen!

Delphi-Quellcode:
Function Tform1.AreFilesEqual( Const file1, file2: String ): Boolean;
Var
  m1, m2: TMemoryStream;
Begin
  Result := False;
  m1 := TMemoryStream.Create;
  try
    m1.LoadFromFile( file1 );
    m2:= TMemoryStream.Create;
    try
      m2.LoadFromFile( file2 );
      If m1.size = m2.size Then
        Result := CompareMem( m1.Memory, m2.memory, m1.size );
    finally
      m2.free;
    end;
  finally
    m1.free;
  end
End;
Mittels Listbox und While-Schleife vergleiche ich so Mehrere Dateien!
Mein Problem ist das das Programm zu viel Speicher einnimmt!

Meine Frage wie kann ich nur die belgeten bytes wieder freigeben bevor die Procedure noch läuft?

Vielen Dank für Hilfe im Vorraus!

@wardz

T-2 Tage :cheers:

ATwardz 3. Okt 2003 17:49

Re: Dateien vegleichen belegt zu viel speicher!
 
Delphi-Quellcode:
  i:=0;
  While i<Listbox2.Count do
  Begin
    u:=0;
    While u<Listbox2.Count-1 do
    Begin
      If i<>u then
      Begin
        If Arefilesequal(Listbox2.Items.Strings[i],Listbox2.Items.Strings[u])=true then
        Begin
          Listbox4.Items.Add(Listbox2.Items.Strings[u]);
          Listbox2.Items.Delete(u);
          u:=Listbox2.Count-1;
          i:=0;
        end;
      end;
        u:=u+1;
    end;
    i:=i+1;
  end;
Wie kann ich nun den belegten speicher nach beendigen der inneren Schleife wieder freigeben während die
Procedure noch läuft?

Danke!

FriFra 3. Okt 2003 18:03

Re: Dateien vegleichen belegt zu viel speicher!
 
Ich würde Dir empfehlen die Dateien Blockweise einzulesen, so brauchst Du auch immer nur diese kleinen Blöcke zu vergleichen und im Speicher zu halten ;)

ATwardz 3. Okt 2003 18:07

Re: Dateien vegleichen belegt zu viel speicher!
 
Wie meinst du das blockweise?

ATwardz 3. Okt 2003 18:14

Re: Dateien vegleichen belegt zu viel speicher!
 
ES wird ja quasi immer eine Datei mit allen anderen nach der reihe verglichen!
Würde das was ändern wenn ich eine DAtei mit allen vergleiche, dies in eine
Procedure packen würde und diese mit einer For Schleife für jede DAtei neu aufrufe?
Ich dachte das das nix ändern würde!

Chewie 3. Okt 2003 18:27

Re: Dateien vegleichen belegt zu viel speicher!
 
Es gibt auch noch eine andere Möglichkeit, sie speziell dann Sinn macht, wenn du Dateien mit mehereren Dateien vergleichen willst: Du erstellst dir von jeder Datei einen Hashwert (Such dazu hier mal nach Hier im Forum suchenMD5 und vergleichst diesen.

OregonGhost 3. Okt 2003 18:28

Re: Dateien vegleichen belegt zu viel speicher!
 
Ein blockweiser Vergleich heißt: Lies einen Block aus der ersten Datei ein, dann einen aus der zweiten und vergleiche diese. Lies dann aus beiden Dateien den nächsten Block ein etc., bis entweder eine der Dateien zu ende ist oder ein Unterschied gefunden wurde. Dabei kann ein Block zum Beispiel 4KB oder auch 1MB groß sein, das ist deine Sache. In Delphi ist dazu glaube ich z.B. BlockRead geeignet (Überraschung (C; ).

Edit: Aber Chewies Methode ist, wenn du mehrere Dateien untereinander vergleichen willst, natürlich auch sinnvoll. Wenn die Dateien alle unterschiedlich sind, ist sie allerdings unter Umständen langsamer. Auch ein vorheriger Größenvergleich macht daher Sinn, denn ungleich große Dateien sind niemals gleich.

ATwardz 3. Okt 2003 20:38

Re: Dateien vegleichen belegt zu viel speicher!
 
Hmmmmm ja, das mit dem HAshen war mir bis vor ein paar Miuten noch ganz neu und ich arbeite mich gerade hinter das Prinzip, hab leider noch kein sehr hilfreiches Tut gefunden immer nur Bruchstücke aus quelltexten!

Weiss,hat jemand ein gutes Tut über hashing???
Wenn ja, wäre sehr dankbar!

@wardz


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 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