AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern

Ein Thema von Benmik · begonnen am 7. Mär 2014 · letzter Beitrag vom 8. Mär 2014
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von himitsu
himitsu
Online

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

AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern

  Alt 7. Mär 2014, 22:25
Einige Dateisysteme bieten auch die Möglichkeit Dateien/Verzeichnisse via ID anzusprechen.
Man braucht da also keinen Dateinamen.

Oder man sieht jeden vollständigen Dateipfad als einzelnen String an, welcher in einer Pfadtabelle gespeichert wird.
> nur eine ID auflösen (hilft nur, bei wenigen Verzeichnissen und vielen Dateien)
Und wer unbedingt will, kann noch weiter sparen, indem er nur einzelne Verzeichnisnamen und die Rootverzeichnisse speichert und diese dann als Baum untereinander verlinkt.
> hier muß man halt erst wieder die Pfade rekursiv zusammensetzen
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#12

AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern

  Alt 7. Mär 2014, 22:44
Vielleicht kann ich die Frage etwas kondensieren.

Ich habe in einem Pfad zu einer Datei z.B. 10 Verzeichnisse, die alle eine ID (Word) haben, also 10 maximal fünfstellige Zahlen.
Gibt es einen Algorithmus, der aus einer solchen Zahlenkombination - bei der auch die Reihenfolge stimmen müsste - eine eindeutige ID errechnen kann?

Wie wäre es, wenn ich die Zahlen hintereinander schriebe und daraus einen Hashwert (z.B. MD4) errechnen würde. Wäre das nicht eindeutig?
Wie machen die Profis sowas?
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#13

AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern

  Alt 7. Mär 2014, 22:49
Die Dateien in der DB sollen mit neuen Dateien verglichen werden, ob sie - also Pfad und Dateiname - schon vorhanden sind. Über TWin32FindData erfolgt dann die weitere Prüfung auf Identität.
Wenn du, wie du schreibst, auf Vorhandensein einer Datei in einem bestimmten Verzeichnis prüfen willst, wozu benötigst du dann eine Datenbank? If FileExists then liefert dir doch bereits diese Information.

Hashwert: Genau! Sind für alle Dateien in der DB vorhanden. Durch den Vergleich soll aber gerade die Berechnung von neuen Hashwerten eingespart werden.
Das verstehe ich jetzt nicht: Wie willst du einen Hashwert finden, wenn du gar nicht weißt, welchen Hashwert du suchst? Das erfährst du doch erst, wenn du aus einem Dateinamen (incl. Pfad) einen Hashwert berechnest. Gibt's den berechnete Hash bereits in der Datenbank, ist die Datei vorhanden, da aus derselben Pfad-Datei-Angabe immer auch derselbe Hashwert berechnet wird, wenn du stets dieselbe Berechnungsmethode anwendest.

Perlsau: Genau das habe ich auch schon realisiert (wenn ich mal davon ausgehe, dass ein View praktisch eine Abfrage ist).
Ein View ist eine virtuelle Tabelle, die in der DB sozusagen ein fest verdrahtetes Select-Ergebnis darstellt. Du kannst ein View wie eine normale Tabelle auslesen. Darin steht dann nicht mehr nur die Id 15, sondern z.B: "C:\Temp\Test\". Wie du mit deinem DBMS ein View erstellst, sollte in der Dokumentation stehen.

1. Zum einen wird sehr viel Speicher verbraucht (unter XP sind oft nur 2 GB im Einsatz, mehr als 3,5 bei 32 Bit nicht drin)
Wofür wird sehr viel Speicher verbraucht?

2. Ich muss dann eventuell sehr lange Pfade vergleichen. Ein Index wird da sehr groß, oder? Ich würde gerne eine eindeutige ID für jede Datei vergeben (Cardinal) und die vergleichen. Ist für bestehende Dateien in der DB natürlich kein Problem, aber es gibt wohl keinen Weg, für eine neue Datei inklusive Pfad auf schnelle Weise zu der identischen ID zu kommen (wenn Name und Pfad gleich sind), oder?
Was heißt "sehr lange Pfade"? Ich hatte vorhin mal getestet und konnte in einem Ordner mit Namen "0123456789" 31 Verschachtelungen mit demselben Namen erstellen, dann war Schluß. Mehr als 256 Byte stehen da wohl nicht zur Verfügung. Doch wie bereits empfohlen: Teste es selbst aus, dann weißt du, was du hast.

Inwieweit soll dir eine eindeutige ID dabei helfen, zu überprüfen, ob eine gegebene Datei incl. Pfad bereits eingetragen ist? Es sei denn, du verwendest keine automatisch erstellten Id, sondern einen Hash, den du aus Datei und Pfad erzeugst und als Primary Key festlegst. Aber hier mußt du natürlich aus dem gesuchten Dateinamen erstmal einen Hashwert erzeugen, um danach suchen zu lassen.

Ich habe in einem Pfad zu einer Datei z.B. 10 Verzeichnisse, die alle eine ID (Word) haben, also 10 maximal fünfstellige Zahlen.
Gibt es einen Algorithmus, der aus einer solchen Zahlenkombination - bei der auch die Reihenfolge stimmen müsste - eine eindeutige ID errechnen kann?
Glaubst du, diese Id wäre nicht eindeutig? Hast du bereits überprüft, ob bei verschiedenen Dateien in verschiedenen Ordnern dieselben Ids vergeben werden? Was sind das für Ids? Woher stammen diese Werte?

Wie wäre es, wenn ich die Zahlen hintereinander schriebe und daraus einen Hashwert (z.B. MD4) errechnen würde. Wäre das nicht eindeutig?
Wenn du aus einem vollständigen Dateinamen einen Hashwert erzeugst, ist der eindeutig, weil in einem Ordner niemals zwei Dateien mit demselben Namen stehen können.

Wie machen die Profis sowas?
Keine Ahnung. Was ist ein Profi? Jemand, der das beruflich macht? Oder jemand, der eine ähnliche Aufgabe bereits gelöst hat?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern

  Alt 7. Mär 2014, 22:57
Ein vergleichbares Konzept wird bei der Backup-Software Retrospect verwendet. Bis zur Version 7.x wurde vor dem Backup von allen Dateien Hash-Werte gebildet und anhand derer wurde überprüft, ob sich die Datei geändert hatte. Als Option können auch gleiche Dateien (gleiche Hash-Werte/Datei-Größe) nur einmal im Backup gespeichert werden.

Die Pfade werden logischerweise auch gespeichert (ich vermute mal auch als Tree, obwohl die Katalog-Dateien auch sehr groß werden).

Ab der Version 8.x läuft ein Dienst mit, der bei Dateiänderungen direkt den Hash-Wert neu berechnet um die Zeit bis zum wirklichen Anlaufen des Backups zu verkürzen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#15

AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern

  Alt 7. Mär 2014, 23:13
Ich bitte um Entschuldigung, ich dachte, es würde reichen, mich auf ein Detailproblem zu konzentrieren. Wie aus diesem Beitrag hervorgeht, geht es um ein selbst gestricktes Backup-Programm, insofern hat Sir Rufo ins Schwarze getroffen. Ich hätte Perlsau einige Mühe ersparen können. Es geht also natürlich darum, bereits gesicherte Dateien in einer DB zu speichern und bei neuen Dateien nachzuschauen, ob man sich die erneute Erstellung einer Prüfsumme sparen kann (in vielen Fällen über 99%). Trotzdem - der Hinweis von Perlsau, ein MD4 von Pfad und Dateinamen zu erstellen, ist schonmal gut!
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#16

AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern

  Alt 7. Mär 2014, 23:16
Wenn es auch um die Überprüfung von Dateiänderungen geht (Dateiname bleibt gleich, Änderungsdatum und ggf. Größe jedoch unterschiedlich), mußt du zur Berechnung eines eindeutigen Hashwerts natürlich auch Größe und Datum mit einbeziehen.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#17

AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern

  Alt 7. Mär 2014, 23:34
Natürlich. Von jeder Datei wird aber ohnehin ein MD4 erstellt. In der DB werden Dateiname, MD4, Größe, Erstellungs- und letztes Änderungsdatum vermerkt. Wenn nun Dateiname, Pfad, Größe, Erstellungs- und letztes Änderungsdatum übereinstimmen, dann spare ich mir die erneute MD4-Berechnung und gehe von Identität aus. Da bei sehr großem Dateibestand der Prozentsatz der geänderten Dateien sehr klein ist, kann man sich so meist >99% der Arbeit sparen.

Retrospect ist natürlich toll, ich weiß aber nicht, ob ich so einen Dienst mitlaufen haben möchte. Insbesondere nicht, wenn ich Videobearbeitung mache.

Ich glaube, ich verfolge jetzt erstmal den Ansatz, die Verzeichnisse mit ID zu versehen und für den Gesamtnamen ein MD4 zu speichern, was mich einheitlich 32 Byte kosten würde.
Vielen Dank für eure Anregungen, und wenn jemand noch eine zündende Idee hat, immer her damit!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern

  Alt 7. Mär 2014, 23:56
Retrospect ist natürlich toll, ich weiß aber nicht, ob ich so einen Dienst mitlaufen haben möchte. Insbesondere nicht, wenn ich Videobearbeitung mache.
Und warum sollte das stören?

Klar kann man das so implementieren, dass es fürchterlich stört, aber auch so, dass es eben nicht störend wirkt.
Wenn die CPU sich langweilt, dann alles berechnen, was da ansteht, ansonsten vornehm zurückhalten und nicht bei jeder Änderung sofort die Berechnung anwerfen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#19

AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern

  Alt 8. Mär 2014, 00:24
Ist natürlich richtig, wenn die Jungs das so geschickt machen. Womit auch Persaus Frage beantwortet wäre, was ein Profi ist Mir jedenfalls stehen solche Möglichkeiten wie die Implementierung eines solchen Dienstes nicht zur Verfügung. Was auch für die blockweise Datensicherung gilt.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#20

AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern

  Alt 8. Mär 2014, 01:12
Ist natürlich richtig, wenn die Jungs das so geschickt machen. Womit auch Persaus Frage beantwortet wäre, was ein Profi ist Mir jedenfalls stehen solche Möglichkeiten wie die Implementierung eines solchen Dienstes nicht zur Verfügung. Was auch für die blockweise Datensicherung gilt.
Nun ja, einer Eigenschaft einen Wert zuweisen, wirst du wohl schon schaffen Delphi-Referenz durchsuchenTThread.Priority.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 15:05 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