Wenn es wie 1.000.000 einzelne Dateien (meistens 100k groß) in einem einzigen Verzeichnis gibt, flach (ohne andere Verzeichnisse und Dateien darin), wird es Kompromisse bei der Effizienz geben oder Nachteile in irgendeiner anderen möglichen Weise?
Antworten
Zu viele Anzeigen?ARG_MAX wird damit ein Problem haben ... zum Beispiel wird rm -rf * (während im Verzeichnis) "zu viele Argumente" sagen. Dienstprogramme, die bestimmte Arten von Globbing (oder eine Shell) durchführen möchten, werden einige Funktionen unterbrechen.
Wenn dieses Verzeichnis öffentlich verfügbar ist (sagen wir über FTP oder Webserver), können zusätzliche Probleme auftreten.
Der Effekt auf ein bestimmtes Dateisystem hängt vollständig von diesem Dateisystem ab. Wie häufig werden diese Dateien zugegriffen, um welches Dateisystem handelt es sich? Denken Sie daran, dass Linux (standardmäßig) kürzlich zugegriffene Dateien lieber im Speicher hält, während Prozesse in den Swap geschoben werden, abhängig von Ihren Einstellungen. Wird dieses Verzeichnis über http bereitgestellt? Wird Google es sehen und durchsuchen? Wenn ja, müssen Sie möglicherweise den VFS-Caches-Druck und die Swappiness anpassen.
Bearbeiten:
ARG_MAX ist eine systemweite Begrenzung dafür, wie viele Argumente dem Einstiegspunkt eines Programms präsentiert werden können. Nehmen wir also 'rm' und das Beispiel "rm -rf *" - die Shell wird '*' in eine durch Leerzeichen getrennte Liste von Dateien umwandeln, die wiederum die Argumente für 'rm' darstellen.
Dasselbe wird mit ls und mehreren anderen Tools passieren. Beispielsweise könnte ls foo* abbrechen, wenn zu viele Dateien mit 'foo' beginnen.
Ich würde empfehlen (unabhängig vom verwendeten Dateisystem), es in kleinere Verzeichnisblöcke aufzuteilen, allein aus diesem Grund.
Meine Erfahrung mit großen Verzeichnissen auf ext3 und dir_index
aktiviert:
- Wenn Sie den Namen der Datei kennen, auf die Sie zugreifen möchten, gibt es fast keine Strafe
- Wenn Sie Operationen ausführen möchten, bei denen der gesamte Verzeichniseintrag gelesen werden muss (wie ein einfaches
ls
in diesem Verzeichnis), dauert es beim ersten Mal mehrere Minuten. Dann bleibt das Verzeichnis im Kernelcache und es gibt keine Strafe mehr - Wenn die Anzahl der Dateien zu hoch wird, treten ARG_MAX und ähnliche Probleme auf. Das bedeutet im Wesentlichen, dass das Verwenden von Wildcards (
*
) nicht mehr wie erwartet funktioniert. Dies gilt nur, wenn Sie wirklich eine Operation auf alle Dateien gleichzeitig ausführen möchten
Ohne dir_index
sind Sie jedoch wirklich im Eimer :-D
Wenn Sie versehentlich "ls" in diesem Verzeichnis ausführen oder die Tabulatortaste verwenden oder "rm *" ausführen möchten, werden Sie in großen Schwierigkeiten sein. Darüber hinaus können Leistungsprobleme je nach Dateisystem auftreten.
Es ist ratsam, Ihre Dateien in Verzeichnisse zu gruppieren, die nach den ersten 2 oder 3 Zeichen der Dateinamen benannt sind, z.B.
aaa/
aaavnj78t93ufjw4390
aaavoj78trewrwrwrwenjk983
aaaz84390842092njk423
...
abc/
abckhr89032423
abcnjjkth29085242nw
...
...
Die meisten Distributionen verwenden standardmäßig Ext3, das für große Verzeichnisse B-Tree-Indizierung verwenden kann. Einige Distributionen haben dieses dir_index
-Feature standardmäßig aktiviert, bei anderen müssten Sie es selbst aktivieren. Wenn Sie es aktivieren, gibt es keine Verlangsamung, selbst bei Millionen von Dateien.
Um zu überprüfen, ob das dir_index
-Feature aktiviert ist (als root):
tune2fs -l /dev/sdaX | grep features
Um das dir_index-Feature zu aktivieren (als root):
tune2fs -O dir_index /dev/sdaX
e2fsck -D /dev/sdaX
Ersetzen Sie /dev/sdaX
durch die Partition, für die Sie es aktivieren möchten.
Die offensichtliche Antwort ist, dass der Ordner für Menschen lange bevor irgendein technisches Limit extrem schwer zu benutzen sein wird (Zeitaufwand, um die Ausgabe von ls zu lesen, nur ein Beispiel, es gibt dutzende andere Gründe). Gibt es einen guten Grund, warum du den nicht in Unterordner aufteilen kannst?
- See previous answers
- Weitere Antworten anzeigen