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:
Danach werden dann die Dateien kopiert.
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; 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 |
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? |
Re: Performanceproblem: Inkrementelles Backup
Ab einer bestimmten Anzahl an Dateien scheint ein Vollbackup sinnvoller zu sein
|
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 |
Re: Performanceproblem: Inkrementelles Backup
Warum nicht einfach das Archiv-Attribut überprüfen? Dein Programm muß es dann bei einer Sicherung allerdings zurücksetzen.
|
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:
|
Re: Performanceproblem: Inkrementelles Backup
Zitat:
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. |
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