Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Performanceproblem: Inkrementelles Backup (https://www.delphipraxis.net/133375-performanceproblem-inkrementelles-backup.html)

Passi077 30. Apr 2009 17:09


Performanceproblem: Inkrementelles Backup
 
Hi,

ich hab mir ein Tool für ein inkrementelles Backup von mehreren Verzeichnissen geschrieben.
In der Testumgebung mit ca. 5000 Files funktioniert das auch wunderbar und sogar sehr performant. Leider ist dies im realen Einsatz, bei dem ca. 75.000 Dateien gesichert werden müssen, nicht mehr der Fall. Es gibt erhebliche Performanceprobleme beim Ausführen.

Das Ganze ist wie folgt implementiert:
Da es sich um ein inkrementelles Backup handelt, muss ich alle gesicherten Dateien mit den entsprechenden Dateien auf der Festplatte abgleichen. Dazu hab ich mir eine pseudo-Hash-Funktion geschrieben, die eben viel schneller ist als MD5 oder ähnliches. Dafür nicht unbedingt eindeutig, aber für meine Zwecke vollkommen ausreichend.

Bei einem Backup gehe ich nun wie folgt vor:
1. Laden der Liste von gesicherten Dateien mit den alten Hashwerten
2. Vergleichen aller dieser Dateien mit den aktuell auf der Festplatte vorhandenen Dateien
3. Daraus eine Liste mit Dateien erstellen, die kopiert werden müssen. Dazu gehören: Neue Dateien und geänderte Dateien
4. Auf der Festplatte nicht mehr vorhandene Dateien markieren

Um die Performance zu erhöhen setze ich auf HashMaps. Diese kommen aus der DCL. Die Zuordnung ist dabei: <Dateiname, Hash>

Die konkrete Implementierung für diese Schritte ist:
Delphi-Quellcode:
procedure TForm1.DoBackUp();
var
  fileListLastState: IStrStrMap;
  fileListCurrState: IStrStrMap;
begin
  // ..
  // Updated und Added Files finden
  iter := fileListCurrState.KeySet.First; // Hier gibt's ein Performanceproblem
  while iter.HasNext do
  begin
    key := iter.Next;
    if fileListLastState.ContainsKey(key) then
    begin
      if not (fileListLastState.GetValue(key)=getHash(key)) then
      begin
        UpdatedFiles.PutValue(key, getHash(key));
      end;
    end
    else
    begin
      AddedFiles.PutValue(key, getHash(key));
    end;
  end;

  // Deleted Files finden
  iter := fileListLastState.KeySet.First; // Hier gibt's ein Performanceproblem

  while iter.HasNext do
  begin
    key := iter.Next;
    if not fileListCurrState.ContainsKey(key) then
    begin
      DeletedFiles.PutValue(key, '-');
    end;
  end;
Danach werden dann die Dateien kopiert.

Das konkrete Problem ist jetzt, wenn die fileListCurrState (Dateien auf der Festplatte) und auch die fileListLastState (Dateien vom letzten Backup) z.B. 75.000 Einträge enthalten. Dann benötigt alleine das Holen eines Iterators für eine Map eine Ewigkeit.

Wie kann ich das Ganze aus performancetechnischer Sicht verbessern? Oder komplett anders aufbauen?

Vielen Dank schon für's Lesen :)
Pascal

Passi077 7. Mai 2009 10:43

Re: Performanceproblem: Inkrementelles Backup
 
Hat keiner eine Idee?
Gerne auch einen komplett anderen Ansatz..

Alles was ich will ist ja, eine große Liste von Dateien mit einer anderen großen Liste von Dateien zu vergleichen und alle geänderten, hinzugefügten oder gelöschten herauszufinden.

Hat jemand einen Tip?

mkinzler 7. Mai 2009 10:51

Re: Performanceproblem: Inkrementelles Backup
 
Ab einer bestimmten Anzahl an Dateien scheint ein Vollbackup sinnvoller zu sein

Dust Signs 7. Mai 2009 10:52

Re: Performanceproblem: Inkrementelles Backup
 
Etwas unsicherer, aber dafür weit schneller, wäre es, anstatt des Hashes die Dateigröße und/oder das letzte Änderungsdatum zu berücksichtigen. Das sollte die Geschwindigkeit erheblich steigern.

Dust Signs

invalid_operation 7. Mai 2009 10:56

Re: Performanceproblem: Inkrementelles Backup
 
Warum nicht einfach das Archiv-Attribut überprüfen? Dein Programm muß es dann bei einer Sicherung allerdings zurücksetzen.

himitsu 7. Mai 2009 11:22

Re: Performanceproblem: Inkrementelles Backup
 
Es kommt auch auf die Art der Verwaltung innerhalb deines Programmes an ... mein altes hSync (man, ich wollte das schon lange mal überarbeiten :cry: ) hat mit soeiner "kleinen" Anzahl an Dateien keinerlei Probleme.

Wie veraltest du denn die Dateien innerhalb?
(womit werden die Dateilisten erstellt und wie arbeiten die Speicherung und Sonstiges)

[add]
Zitat:

Zitat von shmia
Zitat:

Zitat von Passi077
Gerne auch einen komplett anderen Ansatz..

Du kennst den "Trick" mit dem Archiv-Attribut? ...

bei mir hab ich es so gelößt, daß man z.B. auch nur Kombinationen aus Dateidatum und/oder Attributen zur Unterscheidung verwenden kann (statt dem Dateiinhalt)

shmia 7. Mai 2009 12:59

Re: Performanceproblem: Inkrementelles Backup
 
Zitat:

Zitat von Passi077
Gerne auch einen komplett anderen Ansatz..

Du kennst den "Trick" mit dem Archiv-Attribut?
Bei jeder Datei, die neu erstellt oder verändert wird, setzt das Betriebssystem das Archiv-Attribut.
Backupprogramme setzen dann üblicherweise das Archiv-Attribut zurück.

p80286 7. Mai 2009 13:26

Re: Performanceproblem: Inkrementelles Backup
 
Hallo Pascal,

Da es Progamme gibt(gab) die das Archivbit manipulieren habe ich für meine Sicherung, die im Prinzip genauso aufgebaut ist wie Deine, die Finger von diesem Bit gelassen.

Was verstehst Du unter "Performanceproblem"?
Ich spreche über ca 15 k Dateien / 2 Gig / 2500 Dirs
Die Prüfung auf Gleichheit, wobei immer alle Dateien geprüft werden, braucht so ca. 2-3 Min. Ist aber stark vom allgemeinen Netzverkehr abhängig.

Gruß
K-H


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