11 Stimmen

Speichern einer großen Anzahl von Dateien im Dateisystem

Ich habe Millionen von Audiodateien die auf der Grundlage von GUId ( http://en.wikipedia.org/wiki/Globally_Unique_Identifier ). Wie kann ich diese Dateien im Dateisystem speichern, so dass ich effizient weitere Dateien hinzufügen im selben Dateisystem und können Suche für eine bestimmte Datei effizient . Außerdem sollte es in Zukunft skalierbar sein.

Die Dateien werden anhand der GUId (eindeutiger Dateiname) benannt.

Beispiel:

[1] 63f4c070-0ab2-102d-adcb-0015f22e2e5c

[2] ba7cd610-f268-102c-b5ac-0013d4a7a2d6

[3] d03cf036-0ab2-102d-adcb-0015f22e2e5c

[4] d3655a36-0ab3-102d-adcb-0015f22e2e5c

Bitte äußern Sie sich dazu.

PS: Ich bin bereits durch < Speichern einer großen Anzahl von Bildern >. Ich brauche die besondere Datenstruktur/Algorithmus/Logik so dass sie auch skalierbar sein in Zukunft.

EDIT1: Die Anzahl der Dateien beträgt etwa 1-2 Millionen und das Dateisystem ist ext3 (CentOS).

Danke,

Naveen

19voto

sharptooth Punkte 162790

Das ist sehr einfach - erstellen Sie einen Ordnerbaum auf der Grundlage von GUID-Werten Teile.

Legen Sie zum Beispiel 256 Ordner an, die jeweils nach dem ersten Byte benannt sind, und speichern Sie dort nur Dateien, deren GUID mit diesem Byte beginnt. Wenn das immer noch zu viele Dateien in einem Ordner sind, machen Sie das Gleiche in jedem Ordner für das zweite Byte der GUID. Fügen Sie bei Bedarf weitere Ebenen hinzu. Die Suche nach einer Datei wird sehr schnell sein.

Durch die Auswahl der Anzahl der Bytes, die Sie für jede Ebene verwenden, können Sie die Baumstruktur für Ihr Szenario effektiv auswählen.

1voto

cletus Punkte 596503

Ich würde versuchen, die Anzahl der Dateien in jedem Verzeichnis auf eine überschaubare Anzahl zu beschränken. Am einfachsten geht das, indem man das Unterverzeichnis nach den ersten 2-3 Zeichen der GUID benennt.

1voto

prakhar3agrwal Punkte 186

Erstellen Sie eine n-stufige Ordnerhierarchie, um Ihre Dateien zu speichern. Die Namen der verschachtelten Ordner sind die ersten n Bytes des entsprechenden Dateinamens. Zum Beispiel: Um eine Datei "63f4c070-0ab2-102d-adcb-0015f22e2e5c" in einer vier Ebenen tiefen Ordnerhierarchie zu speichern, konstruieren Sie 6/3/f/4 und platzieren Sie diese Datei in dieser Hierarchie. Die Tiefe der Hierarchie hängt von der maximalen Anzahl der Dateien ab, die Sie in Ihrem System haben können. Bei einigen Millionen Dateien in meinem Projekt funktioniert eine Hierarchie mit vier Ebenen gut.

Dasselbe habe ich auch bei meinem Projekt mit fast 1 Million Dateien gemacht. Meine Anforderung war auch, die Dateien zu verarbeiten, indem ich diese riesige Liste durchlief. Ich habe eine 4 Ebenen tiefe Ordnerhierarchie erstellt und die Verarbeitungszeit von fast 10 Minuten auf einige Sekunden reduziert.

Ein Zusatz zu dieser Optimierung kann sein, dass, wenn Sie alle Dateien in diesen tiefen Ordnerhierarchien verarbeiten wollen, dann anstatt eine Funktion aufzurufen, um die Liste für die ersten 4 Ebenen zu holen, einfach alle möglichen 4 Ebenen tiefen Ordnerhierarchienamen vorberechnet werden. Angenommen, die Guid kann 16 mögliche Zeichen haben, dann haben wir 16 Ordner auf den ersten vier Ebenen, wir können einfach die 16*16*16*16 Ordnerhierarchien vorberechnen, was nur ein paar ms dauert. Dies spart eine Menge Zeit, wenn diese große Anzahl von Dateien an einem gemeinsamen Ort gespeichert ist und der Aufruf einer Funktion zum Abrufen der Liste in einem Verzeichnis fast eine Sekunde dauert.

0voto

sambowry Punkte 2386

Das Sortieren der Audiodateien in separate Unterverzeichnisse kann langsamer sein, wenn dir_index auf dem ext3-Volume verwendet wird. (dir_index: "Use hashed b-trees to speed up lookups in large directories.")

Mit diesem Befehl wird das Merkmal dir_index gesetzt: tune2fs -O dir_index /dev/sda1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X