Ich habe eine Anwendung, die in ein ext3-Verzeichnis schreibt, das im Laufe der Zeit auf ungefähr drei Millionen Dateien angewachsen ist. Unnötig zu erwähnen, dass das Lesen der Dateiliste dieses Verzeichnisses unerträglich langsam ist.
Ich beschuldige ext3 nicht. Die richtige Lösung wäre gewesen, den Anwendungscode in Unterverzeichnisse schreiben zu lassen, ./a/b/c/abc.ext
anstatt ihn nur zu verwenden ./abc.ext
.
Ich wechsle zu einer solchen Unterverzeichnisstruktur und meine Frage lautet einfach: Wie viele Dateien sollte ich ungefähr in einem ext3-Verzeichnis speichern, ohne die Leistung zu beeinträchtigen? Was ist deine Erfahrung?
Oder mit anderen Worten; Angenommen, ich muss drei Millionen Dateien in der Struktur speichern. Wie viele Ebenen sollte die ./a/b/c/abc.ext
Struktur tief sein?
Offensichtlich ist dies eine Frage, die nicht genau beantwortet werden kann, aber ich suche nach einem Schätzwert für das Baseballstadion.
http://en.wikipedia.org/wiki/Ext3#Functionality - Hier wird erwähnt, dass ein Verzeichnis nur ungefähr 32000 Unterverzeichnisse haben kann, aber keine Dateien erwähnt.
http://roopindersingh.com/2008/05/10/ext3-handling-large-number-of-files-in-a-directory/
Außerdem hasse ich Experts Exchange, aber ich habe einen Kommentar zu dieser Frage gelesen , dass es ideal ist, weniger als 10-15.000 pro Verzeichnis zu haben.
quelle
Ich kann auf einem ziemlich leistungsfähigen Server mit viel Speicher unter einer anständigen Last bestätigen, dass 70.000 Dateien allerlei Chaos anrichten können. Ich habe einen Cache-Ordner mit 70.000 Dateien entfernt und Apache hat damit begonnen, neue Instanzen zu erzeugen, bis die maximale Größe 255 erreicht war und das System den gesamten freien Speicher verwendet hat (16 GB, obwohl die virtuelle Instanz möglicherweise niedriger war). In beiden Fällen ist es wahrscheinlich sehr umsichtig, den Wert unter 25.000 zu halten
quelle
Meiner Erfahrung nach besteht der beste Ansatz darin, die Dateistruktur nicht im Voraus zu überarbeiten. Wie in mindestens einer anderen Antwort erwähnt, gibt es Dateisystemerweiterungen, die sich mit dem Leistungsproblem befassen.
Das Problem, auf das ich häufiger gestoßen bin, ist die Benutzerfreundlichkeit im administrativen Bereich. Die geringste Menge an Arbeit, die Sie tun können, um die Anzahl der Dateien in einem Verzeichnis zu verringern, ist wahrscheinlich der Ansatz, den Sie gerade benötigen.
sqrt (3_000_000) == 1732
Ein paar tausend Dateien in einem einzigen Verzeichnis klingen für mich vernünftig. Sei dein eigener Richter für deine eigene Situation. Um dies zu erreichen, versuchen Sie, die Dateien in eine einzelne Ebene von Hash-Verzeichnissen aufzuteilen, sodass die durchschnittliche Anzahl der Dateien pro Verzeichnis in etwa der Anzahl der Verzeichnisse entspricht.
Angesichts Ihrem Beispiel hierfür wäre
./a/abc.ext
,./ab/abc.ext
,./abc/abc.ext
, ....Die Verbreitung von Dateien hängt stark von den tatsächlichen Dateinamen ab. Stellen Sie sich vor, Sie wenden diese Technik auf ein Verzeichnis mit jeweils einer Million Dateien an
foobar???.txt
. Es gibt Möglichkeiten, eine gleichmäßigere Verteilung zu erzielen, wie das Hashing basierend auf dem Wert einer bestimmten Anzahl von Bits aus der MD5-Summe jedes Dateinamens.quelle
Hmm, ich habe diesen Artikel kürzlich gelesen . Im Wesentlichen nutzen Sie die Verteilung Ihres bevorzugten Hashing-Algorithmus. Ich habe angefangen, mit den Zahlen zu spielen, eine mit MySQL signierte INT hat einen Maximalwert von 2147483647. Sie können auch die gewünschte Anzahl von Dateien pro Verzeichnis und Anzahl von Unterverzeichnissen variieren, um die endgültige Anzahl von Unterverzeichnissen / Dateien festzulegen. Aufteilung pro Verzeichnis für einen bestimmten Datensatz, aber es ist schwierig, empirische Belege für optimale Verzeichnis- / Dateiorganisationen zu finden. Dieser Artikel gibt einen Einblick in Leistungsunterschiede zwischen Dateisystemen (einige interessante Metriken), aber nichts über optimale Organisationen.
quelle
Ich denke, Sie denken zu viel darüber nach. Wenn Sie sich sogar für eine einzelne zusätzliche Verzeichnisebene entschieden hätten und die Dinge gleichmäßig ausgleichen könnten, hätten Sie 1732 * -Verzeichnisse und 1732 Dateien pro Verzeichnis.
Wenn Sie nicht vorhaben, zig Milliarden von Dateien zu benötigen, könnten Sie so ziemlich eine Zahl zwischen 1000 und 100.000 auswählen und gute Ergebnisse erzielen.
* Quadratwurzel von 3 Millionen.
quelle