Einzelnen Beitrag anzeigen

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