![]() |
AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern
Hallo,
bei einer richtigen DB (z.B. Firebird) gibt es kein RAM-Problem. Die Dateinamen / Indizes sind eh schon komprimiert. Was willst du denn verwenden ? Heiko |
AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern
Ich verstehe die ganze Problematik nicht. Ich habe eine Liste von eindeutigen Dateinamen. Wie die im Detail aussehen, ist doch zunächst vollkommen egal.
Nun möchte ich wissen, ob sich die Datei verändert hat, um sie ggf. neu zu sichern. Da bietet sich zunächst das Archivbit an (Größe und Änderungsdatum vielleicht noch). Ein Hash... ich weiß nicht, ob es sinnvoll ist, Bestrebungen des Anwenders zu umgehen, eine Datei zu ändern, ohne das Archivbit zu setzen. Soweit ich weiß, wird das bei jeder Änderung gesetzt. Weiterhin ist das eine sehr einfache Möglichkeit, Dateien vom Archivieren auszuschließen (einfach nicht setzen bzw. zurücksetzen). Aber gut, auch zweitrangig, wie man Änderungen feststellt. Es geht ja hier um die Frage, wie man so eine Dateiliste in einer Datenbank ablegt. Natürlich ist hier auch entscheidend, was mit der Liste angestellt werden soll, d.h. die Speicherstrategie richtet sich nach den Retrievalanforderungen. In den meisten Fällen wird eine einfache Liste, d.h. Tabelle, am schnellsten umzusetzen und für die meisten Use Cases geeignet sein. Allerdings kann ich mir bei einem richtig guten Backupprogramm auch vorstellen, das es Umbenennungen von Verzeichnissen und Dateien mitbekommt und seine eigene Liste entsprechend überarbeitet. Wenn man das umsetzen will und (!) wirklich sehr viele Dateien hat(> 1Mio), dann wäre ein anderes Speichermodel vielleicht sinnvoll(naheliegend: Baum). Ansonsten ist die banale Liste wirklich keine Hürde. Die Suche (auch nach Verzeichnissen) kann immer einen Index verwenden, denn man vergleicht ja den Anfang (also ein "LIKE 'FOO%'"). Mal eben 1000 Dateien umzubenennen ist nun auch keine Hürde. Um ehrlich zu sein, würde ich noch nicht einmal eine Datenbank nehmen. Die Rechnung sieht so aus: Maximale Anzahl der Dateien, die supported werden: 1 Mio (Beispiel) Maximale Länge eines Dateinamens : 255 Bytes. Benötigter Speicher dafür: 256 MB. Wo war jetzt gleich das Problem? Benötigst Du allerdings 100 Mio Dateien, dann solltest Du dir eine DB anschaffen, das ist logisch. Zitat:
|
AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern
Man kann auch problemlos einen Prozess sich selbst überwachen lassen, so dass er z.B. nie mehr als x Prozent der Systemleistung benutzt. So eine Speicherung von sehr vielen Dateinamen hatte ich vor 20 Jahren mal gemacht, als es wirklich noch auf jedes Byte ankam.
Damals wurden damit im Fidonet Dateibestaende verwaltet. Die Struktur war VolumeID, PathID, FileName. Das ging ziemlich gut. |
AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern
Zitat:
Ich habe beide Varianten ausprobiert, Verzeichnisse mit ID in einer getrennten Tabelle und Speicherung des vollen Namens. Schon bei mir reichen da 256 Byte nicht aus, ein Echt-Beispiel aus der Praxis lautet "D:\Daten\Gemeinsam\Projekte\Video\Edius\Projektda teien\Tropenhaus\Echoes of Nature - Jungle Talk\Sounds Of Nature - Fresh Country Rain\Sounds Of Nature - Fresh Country Rain\Sounds Of Nature-Fresh Country Rain\Sounds Of Nature - 01 - Fresh Country Rain - (with music).mp32". Ich bn mir sicher, dass es da noch ganz andere Kaliber gibt. Man kann sich fragen, warum das eine Verzeichnis drei Mal auftaucht, aber es war eben so (da hatte ich wegen Resampeln rasch mal das Verzeichnis kopiert), und dann muss man auch bei anderen damit rechnen. Leider benötigte ich mehrere Indizes, nicht nur den Dateinamen, sondern auch noch für Größe und MD4, mit der Folge, dass Dateioperationen unglaublich langsam wurden. Nochmal zum Entwurf: Alle Dateien sollen durch MD4 eindeutig identifizierbar sein, unabhängig von Name und Pfad. Diese Erstellung von MD4 ist das Zeitaufwendigste, daher wüsste ich nicht, wie das Speichern der vorhandenen Dateien mit MD4 ohne Datenbank gehen sollte. Bei bereits vorhandenen MD4-Prüfsummen kann die erneute Erstellung entfallen, dazu prüfe ich Pfad, Dateiname, Größe, Erstellungs- und Änderungsdatum und übernehmen dann die MD4 aus der DB. Gehört jetzt vielleicht nicht mehr zum Thema, aber die 32 Byte von MD4 oder MD5 sind mir für läppische Dateinamen ein bisschen viel. Welche Prüfsumme hat denn 16 Byte? Oder kann ich einfach die ersten 16 von MD4 nehmen, wie hoch ist da die Wahrscheinlichkeit von ![]()
Delphi-Quellcode:
in einen HexString umwandeln kann. In den mem_utils finde ich nichts, das passt.
type
TCRC64 = packed record lo32, hi32: longint; end; |
AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern
also ,
du wandelst lo32 und hi32 jeweils separat in eine Hexstring und haengst dann die 2 Strings aneinander lo32hx:=hexstring(lo32); hi32hx:=hexstring(hi32); crc64hx:=hi32hx+lo32hx; oder verstehe ich das jetzt vollkommen falsch ? |
AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern
Klappt! Danke.
|
AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern
Du könntest die ganze Geschichte auch in den Alternate Data Streams unterbringen.
Also jeder Datei einen dolchen verpassen, in dem dann der Hash drinsteht, zusammen mit dem Erzeugungsdatum des Hashs. Wenn du dann das Verzeichnis mit dem Backup vergleichst, greifst du wieder darauf zu und vergleichst für jede Datei 1. Ob der Hash noch aktuell ist, ggf. neu erzeugen und 2. Ob er überein stimmt. Das geht natürlich nur für NTFS. Sicherungen auf ein Netzlaufwerk werden damit schwierig. Aber da du eh schon von Hardlinks sprachst, erfolgt das Backup ja eh von NTFS nach NTFS, oder? |
AW: Hunderttausende Dateinamen mit Pfaden effizient in Datenbank speichern
Völlig richtig, da Hardlinks eine große Rolle spielen sollen, ist NTSF Voraussetzung. ADS ist natürlich ein ganz neuer, interessanter Gedanke, umso mehr, da sich in meiner Sammlung von Delphi-Routinen auch die zum Auslesen und Schreiben von ADS finden. Ich müsste mal grübeln, ob das sicher genug ist. Eine Datenbank ist ein gesicherter Raum, während die Dateien mit den ADS ja "in freier Wildbahn" verbleiben und dort alle möglichen Programm alles Mögliche mit ihnen anstellen können. Ich habe auch noch nie gehört, dass ADS für Sicherungszwecke verwendet werden, das wird doch wohl seinen Grund haben? Aber bestechend ist der Gedanke schon!
PS: Da hast du mir einen Floh ins Ohr gesetzt! Das Setzen und Wiederauslesen der ADS ist kinderleicht! Ein gewisser Nachteil: Anscheinend sind (jedenfalls unter Windows 7) Administratorrechte erforderlich. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz