AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Performanceproblem: Inkrementelles Backup

Performanceproblem: Inkrementelles Backup

Ein Thema von Passi077 · begonnen am 30. Apr 2009 · letzter Beitrag vom 7. Mai 2009
Antwort Antwort
Passi077

Registriert seit: 7. Okt 2004
23 Beiträge
 
#1

Performanceproblem: Inkrementelles Backup

  Alt 30. Apr 2009, 18:09
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
  Mit Zitat antworten Zitat
Passi077

Registriert seit: 7. Okt 2004
23 Beiträge
 
#2

Re: Performanceproblem: Inkrementelles Backup

  Alt 7. Mai 2009, 11:43
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Performanceproblem: Inkrementelles Backup

  Alt 7. Mai 2009, 11:51
Ab einer bestimmten Anzahl an Dateien scheint ein Vollbackup sinnvoller zu sein
Markus Kinzler
  Mit Zitat antworten Zitat
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#4

Re: Performanceproblem: Inkrementelles Backup

  Alt 7. Mai 2009, 11:52
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
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat
invalid_operation
(Gast)

n/a Beiträge
 
#5

Re: Performanceproblem: Inkrementelles Backup

  Alt 7. Mai 2009, 11:56
Warum nicht einfach das Archiv-Attribut überprüfen? Dein Programm muß es dann bei einer Sicherung allerdings zurücksetzen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Performanceproblem: Inkrementelles Backup

  Alt 7. Mai 2009, 12:22
Es kommt auch auf die Art der Verwaltung innerhalb deines Programmes an ... mein altes hSync (man, ich wollte das schon lange mal überarbeiten ) 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 von shmia:
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Performanceproblem: Inkrementelles Backup

  Alt 7. Mai 2009, 13:59
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Performanceproblem: Inkrementelles Backup

  Alt 7. Mai 2009, 14:26
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:49 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