Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Wie vergleicht man 2 sehr große Liste (>1.000.000 Einträge)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.03.2011, 17:01 Uhr
StefanKittel



Hallo,
ich will mit einem Programme eine Library ansteuern um Dateien in eine ZIP-Datei zu schreiben.

Nun drüfeen aber aus Zeitgründen nur geänderte Dateien kopiert werden.
Also ein incrementelles Backup.

Dazu lesen ich aus der Ursprungsdatei alle Einträge aus.
Eine Callback Routine wird für jede Datei aufgerufen. Ich vergleiche die Daten mit der Datei auf der Festplatte und speicher sie aktuell in eine CStringList.

Beim starten der normalen Sicherung wird jede zu sichernde Datei vorher per Callbackup nachgefragt. Ich vergleiche sie mit der Liste. Sobald der Eintrag dort vorhanden ist, überspring ich die Datei und lösche den Eintrag in der Liste um die Größe zu reduzieren.

Das ganze funktioniert prima mit 10tausenden Dateien. Bei 1.000.000 dauert der Abgleich aber mehr als 12 Stunden (Xeon Quad).

Am einfachsten wäre es ja zwei Liste zu haben, diese zu sortieren und dann abzugleichen. Geht aber wegen dem Callback beim Backup nicht.

Ich versuche Heute Abend mal eine Liste mit 128Bit MD5 zu verwenden (__int128?).

Hat da sonst noch Jemand eine zündende Idee?

Danke

Stefan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.03.2011, 20:16 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Naja,

evtl wäre es sinnvoller, die funktionialität nicht selbst zu bauen, sondern direkt eine einigermaßen leistungsfähige Datenbank (da sollte z.B sqllite/mssqle o.ä reichen) zu verwenden. die sind für genau solche aufgaben getrimmt.

Ansonsten vermute ich stark, das du schon einen großen Overhead bei der Speicheralloziierung hast (oder reservierst du in der CStringList dir direkt gleich mal ne Million-Einträge, bevor du das einlesen beginnst?) - das ständige vergrößern und ggf. umkopieren der liste frisst sicherlich ordentlich zeit.

Oder du prüfst mal mit einem Profiler, was an deinem Algorithmus so viel zeit frisst.


Zwei sortierte listen zu haben, macht das ganze logischweise schon einfacher, da du nur beide listen einmal von oben nach unten durchlaufen musst, dafür bringt das sortieren halt wieder einen großen Zeitaufwand mit sich
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.03.2011, 20:49 Uhr
ao

(Operator)


Es kommt mir ungünstig vor, bei einem Archiv mit einer Million Dateien für jede einzelne per Callback zu fragen "soll ich diese Datei sichern?", wenn der Anteil der geänderten Files nur klein ist.

Kannst du nicht andersrum vorgehen und das Dateisystem auf der Platte absuchen und alle Dateien sichern, die ein gesetztes Archivbit haben? Das Archivbit wurde genau für solche Zwecke erfunden?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.03.2011, 00:00 Uhr
StefanKittel




Zitat von FloSoft:
evtl wäre es sinnvoller, die funktionialität nicht selbst zu bauen, sondern direkt eine einigermaßen leistungsfähige Datenbank (da sollte z.B sqllite/mssqle o.ä reichen) zu verwenden. die sind für genau solche aufgaben getrimmt.

Geht leider aus verschiedenen Gründen nicht.


Zitat von ao:
Kannst du nicht andersrum vorgehen und das Dateisystem auf der Platte absuchen und alle Dateien sichern, die ein gesetztes Archivbit haben?

Ich schon, die library nicht. Es gibt dort sehr komplexe routinen für die Auswahl der Dateien und ich darf nun das genannte anflicken.
Stefan

Dieser Post wurde am 16.03.2011 um 00:01 Uhr von StefanKittel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.03.2011, 09:46 Uhr
ao

(Operator)


Na gut, dann noch mal anders. Ich habe noch nicht verstanden, wozu dieses Listengeraffel überhaupt nötig ist.

Wenn die Lib dich im Callback fragt, ob sie ein bestimmtes File archivieren soll, warum holst du dir nicht den zugehörigen Dateisystem-Eintrag, und wenn dort das Archivbit gesetzt ist, sagst du ja, und sonst nein?

Ansonsten:

Zitat:
Dazu lesen ich aus der Ursprungsdatei alle Einträge aus.
Eine Callback Routine wird für jede Datei aufgerufen. Ich vergleiche die Daten mit der Datei auf der Festplatte und speicher sie aktuell in eine CStringList.

Beim starten der normalen Sicherung wird jede zu sichernde Datei vorher per Callbackup nachgefragt. Ich vergleiche sie mit der Liste. Sobald der Eintrag dort vorhanden ist, überspring ich die Datei und lösche den Eintrag in der Liste um die Größe zu reduzieren.


Ich habe nicht viel verstanden, außer dass es zwei Verarbeitungsschritte gibt und dass irgendwas verglichen und und in Listen gespeichert wird. Erklär das bitte mal präziser.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: