Wenn es etwa 1.000.000 einzelne Dateien (meist 100k) in einem einzigen Verzeichnis gibt (ohne andere Verzeichnisse und Dateien), gibt es irgendwelche Kompromisse bei der Effizienz oder Nachteile auf andere mögliche Arten?Was passiert, wenn unter Linux zu viele Dateien in einem einzigen Verzeichnis vorhanden sind?
Antwort
ARG_MAX wird damit umgehen ... zum Beispiel, rm -rf * (während im Verzeichnis) wird sagen "zu viele Argumente". Dienstprogramme, die eine Art Globbing (oder eine Shell) durchführen wollen, werden einige Funktionalitätspausen haben.
Wenn dieses Verzeichnis für die Öffentlichkeit verfügbar ist (sagen wir via FTP oder Webserver), können zusätzliche Probleme auftreten.
Die Auswirkung auf ein beliebiges Dateisystem hängt vollständig von diesem Dateisystem ab. Wie häufig wird auf diese Dateien zugegriffen? Was ist das Dateisystem? Denken Sie daran, dass Linux (standardmäßig) es vorzieht, zuletzt aufgerufene Dateien im Speicher zu belassen, während Prozesse abhängig von Ihren Einstellungen in Swap versetzt werden. Wird dieses Verzeichnis über http bedient? Wird Google es sehen und crawlen? Wenn dies der Fall ist, müssen Sie möglicherweise den VFS-Cachedruck und das Swappiness anpassen.
Edit:
ARG_MAX ist eine systemweite Limit, wie viele Argumente können zu einer Programmeinstiegspunkt präsentiert. Nehmen wir also 'rm' und das Beispiel 'rm -rf *' - die Shell wird '*' in eine durch Leerzeichen getrennte Liste von Dateien verwandeln, die wiederum zu den Argumenten für 'rm' werden.
Das gleiche wird mit ls und mehreren anderen Tools passieren. Zum Beispiel kann ls foo * brechen, wenn zu viele Dateien mit 'foo' beginnen.
Ich rate (egal was fs verwendet wird), um es in kleinere Verzeichnisstücke aufzuteilen, nur aus diesem Grund allein.
Wenn Sie versehentlich "ls" in diesem Verzeichnis ausführen oder die Tabulatorvervollständigung verwenden oder "rm *" ausführen möchten, sind Sie in großen Schwierigkeiten. Je nach Dateisystem treten möglicherweise Leistungsprobleme auf.
Es ist gute Praxis, Ihre Dateien in Verzeichnisse zu gruppieren, die nach den ersten zwei oder drei Zeichen der Dateinamen benannt sind, z.
aaa/ aaavnj78t93ufjw4390 aaavoj78trewrwrwrwenjk983 aaaz84390842092njk423 ... abc/ abckhr89032423 abcnjjkth29085242nw ... ...
Die meisten Distributionen verwenden Ext3 standardmäßig, die b-Baum Indizierung für große Verzeichnisse verwenden können. Einige der Distributionen haben diese dir_index
-Funktion standardmäßig aktiviert, in anderen müssen Sie sie selbst aktivieren. Wenn Sie es aktivieren, gibt es auch bei Millionen von Dateien keine Verlangsamung.
Um zu sehen, ob dir_index
Funktion do aktiviert wird (als root):
tune2fs -O dir_index /dev/sdaX
e2fsck -D /dev/sdaX
/dev/sdaX
mit Partition, für die Sie aktivieren möchten, ersetzen zu:
tune2fs -l /dev/sdaX | grep features
dir_index Funktion (als root) aktivieren es.
Es gibt * eine Strafe, der Unterschied liegt zwischen einer exponentiellen, linearen oder logarithmischen Strafe – dsm
Machen Sie Ihre Zahlen. Sie haben 1mln Dateien. Mit dem Index dauert es N Sekunden, um auf die Datei nach Namen zuzugreifen. Jetzt würden Sie es in 1000 Verzeichnisse mit je 1000 Dateien aufteilen. Es dauert N/2 Sekunden, um auf das Verzeichnis zuzugreifen, ein weiteres N/2, um auf die Datei zuzugreifen. Summe N Sekunden, die den Overhead für das Wechseln der Verzeichnisse nicht berücksichtigt. – vartec
Die offensichtliche Antwort ist der Ordner wird extrem schwierig für Menschen, lange vor jeder technischen Grenze zu verwenden, (Zeit genommen, um die Ausgabe von ls für einen zu lesen, sind sie Dutzende von anderen Gründen) Gibt es einen guten Grund, warum Sie kann nicht in Unterordner aufgeteilt werden?
Meine Erfahrung mit großen Verzeichnissen auf ext3 und dir_index
aktiviert:
- Wenn Sie den Namen der Datei, die Sie zugreifen möchten wissen, gibt es fast keine Strafe
- Wenn Sie Operationen, dass die Notwendigkeit zu tun, wollen Um den gesamten Verzeichniseintrag einzulesen (wie eine einfache
ls
in diesem Verzeichnis), wird es zum ersten Mal einige Minuten dauern. Dann bleibt das Verzeichnis im Kernel-Cache und es gibt keine Strafe mehr - Wenn die Anzahl der Dateien zu hoch wird, treten Sie in ARG_MAX et al Probleme. Das bedeutet, dass Wildcarding (
*
) nicht immer wie erwartet funktioniert. Dies ist nur, wenn Sie wirklich eine Operation auf alle Dateien auf einmal
Ohne dir_index
jedoch durchführen möchten, sind Sie wirklich geschraubt :-D
Nicht jedes Dateisystem unterstützt, dass viele Dateien.
Bei einigen von ihnen (ext2, ext3, ext4) ist es sehr einfach, das Inode-Limit zu erreichen.
- 1. Viele Dateien in einem Verzeichnis?
- 2. Überprüfen, ob .gz-Dateien in einem Verzeichnis vorhanden sind
- 3. Was passiert, wenn die Metatags im Dokumentkörper vorhanden sind?
- 4. Linux Bash - entfernen Sie alle Dateien, die in einem Verzeichnis aus einem anderen Verzeichnis sind
- 5. benötigen viele Dateien in einem Verzeichnis kombinieren
- 6. Woher weiß man, wenn zu viele Logging-Nachrichten vorhanden sind?
- 7. Git: automatisch alle Dateien unter einem Verzeichnis
- 8. Warum sind RackMultipart * -Dateien in meinem Rails/tmp-Verzeichnis vorhanden?
- 9. Wenn Verzeichnis keine Dateien hat dann ... - Linux
- 10. Was sind die Möglichkeiten, Verzeichnis in einzelne Datei zu komprimieren
- 11. Wie viele Dateien pro Verzeichnis gibt es maximal? (Linux)
- 12. \ SweaveInput {} Fehlermeldung, die Dateien nicht vorhanden, die vorhanden sind
- 13. LINUX: Link alle Dateien von einem in ein anderes Verzeichnis
- 14. Festlegen der Standardberechtigungen für neu erstellte Dateien und Unterverzeichnisse in einem Verzeichnis unter Linux?
- 15. Was passiert, wenn Verbindungen zu MongoDB nicht geschlossen sind?
- 16. Was passiert, wenn ich ibdata1 in mysql (LINUX) löschen
- 17. Umbenennen aller Dateien im aktuellen Verzeichnis unter Linux
- 18. Was passiert, wenn kein Speicher vorhanden ist, um eine OutOfMemoryException in C# zu erstellen?
- 19. Schriften auf org.eclipse.swt.widgets.Composite sind unter Linux
- 20. (iphone) imageNamed, wenn mehrere Dateien mit demselben Namen vorhanden sind?
- 21. Wie viele PHP-Includes sind zu viele?
- 22. Was passiert, wenn NSTimer in
- 23. Was passiert, wenn ich alle Dateien aus Kompilierquellen in den Erstellungsphasen für das Projekt lösche?
- 24. Macht libcxxabi unter Linux Sinn? Was sind die Vorteile?
- 25. Was passiert, wenn make_shared
- 26. Verzeichnis erstellen, wenn nicht vorhanden
- 27. Zu viele offene Dateien: wie viele offen sind, was sie sind, und wie viele kann die JVM offen
- 28. Verzeichnis des laufenden Programms unter Linux?
- 29. Linux ist es möglich, den Inhalt aller Dateien in einem Verzeichnis zu leeren
- 30. Was sind FTL-Dateien?
Vielen Dank Herr :) Dieser Beitrag von mir hat mir wirklich sehr geholfen! –