Ist es wichtig, wie viele Dateien ich in einem einzigen Verzeichnis aufbewahre? Wenn ja, wie viele Dateien in einem Verzeichnis sind zu viele und wie wirkt es sich aus, wenn zu viele Dateien vorhanden sind? (Dies ist auf einem Linux-Server.)
Hintergrund: Ich habe eine Fotoalbum-Website und jedes hochgeladene Bild wird in eine 8-hexadezimale ID umbenannt (z. B. a58f375c.jpg). Dies dient zur Vermeidung von Dateinamenkonflikten (wenn beispielsweise viele "IMG0001.JPG" -Dateien hochgeladen werden). Der ursprüngliche Dateiname und alle nützlichen Metadaten werden in einer Datenbank gespeichert. Im Moment habe ich ungefähr 1500 Dateien im Bilderverzeichnis. Dadurch dauert es einige Sekunden, bis die Dateien im Verzeichnis (über den FTP- oder SSH-Client) aufgelistet sind. Aber ich kann nicht sehen, dass es eine andere Wirkung hat. Insbesondere scheint es keinen Einfluss darauf zu haben, wie schnell eine Bilddatei dem Benutzer bereitgestellt wird.
Ich habe darüber nachgedacht, die Anzahl der Bilder zu reduzieren, indem ich 16 Unterverzeichnisse erstellt habe: 0-9 und af. Dann würde ich die Bilder in die Unterverzeichnisse verschieben, basierend auf der ersten hexadezimalen Ziffer des Dateinamens. Ich bin mir jedoch nicht sicher, ob es einen Grund dafür gibt, außer der gelegentlichen Auflistung des Verzeichnisses über FTP / SSH.
quelle
Ich habe über 8 Millionen Dateien in einem einzigen ext3-Verzeichnis gehabt. Libc
readdir()
die von verwendet wirdfind
,ls
und die meisten der anderen Methoden in diesem Thread Liste großen Verzeichnissen diskutiert.Der Grund
ls
undfind
die Langsamkeit in diesem Fall besteht darin, dassreaddir()
nur 32 KB Verzeichniseinträge gleichzeitig gelesen werden. Auf langsamen Festplatten sind daher viele, viele Lesevorgänge erforderlich, um ein Verzeichnis aufzulisten. Für dieses Geschwindigkeitsproblem gibt es eine Lösung. Ich habe einen ziemlich detaillierten Artikel darüber geschrieben unter: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with- ls /Der Schlüssel zum Mitnehmen lautet: Verwenden Sie
getdents()
direkt - http://www.kernel.org/doc/man-pages/online/pages/man2/getdents.2.html und nicht alles, was auf libc basiert,readdir()
damit Sie den Puffer angeben können Größe beim Lesen von Verzeichniseinträgen von der Festplatte.quelle
Ich habe ein Verzeichnis mit 88.914 Dateien. Wie Sie wird dies zum Speichern von Miniaturansichten und auf einem Linux-Server verwendet.
Gelistete Dateien über FTP oder eine PHP-Funktion sind zwar langsam, aber es gibt auch einen Leistungseinbruch beim Anzeigen der Datei. zB www.website.com/thumbdir/gh3hg4h2b4h234b3h2.jpg hat eine Wartezeit von 200-400 ms. Zum Vergleich auf einer anderen Seite habe ich mit ca. 100 Dateien in einem Verzeichnis das Bild nach nur ~ 40ms Wartezeit angezeigt.
Ich habe diese Antwort gegeben, da die meisten Leute gerade geschrieben haben, wie Verzeichnissuchfunktionen ausgeführt werden, die Sie nicht für einen Daumenordner verwenden - nur statische Dateien anzeigen, aber an der Leistung interessiert sind, wie die Dateien tatsächlich verwendet werden können .
quelle
Dies hängt ein wenig von dem spezifischen Dateisystem ab, das auf dem Linux-Server verwendet wird. Heutzutage ist die Standardeinstellung ext3 mit dir_index, was das Durchsuchen großer Verzeichnisse sehr schnell macht.
Geschwindigkeit sollte also kein anderes Problem sein als das, das Sie bereits bemerkt haben. Das heißt, dass Listings länger dauern werden.
Die Gesamtzahl der Dateien in einem Verzeichnis ist begrenzt. Ich scheine mich zu erinnern, dass es definitiv bis zu 32000 Dateien funktioniert.
quelle
dir_index
aktiviertem. Ich hatte ungefähr 17 Millionen Dateien im Verzeichnis. Die Antwort war, sichlarge_dir
mit tune2fs einzuschalten.Beachten Sie, dass unter Linux die Shell möglicherweise keine Platzhalter erweitern kann, wenn Sie ein Verzeichnis mit zu vielen Dateien haben. Ich habe dieses Problem mit einem Fotoalbum, das unter Linux gehostet wird. Es speichert alle Bilder in der Größe in einem einzigen Verzeichnis. Während das Dateisystem viele Dateien verarbeiten kann, kann die Shell dies nicht. Beispiel:
oder
quelle
exec
Implementierung des Systems . Die Shell kann den Platzhalter normalerweise problemlos erweitern - es ist der Aufrufexec
mit so vielen Argumenten, der den Fehler zurückgibt.Ich arbeite gerade an einem ähnlichen Problem. Wir haben eine hierarchische Verzeichnisstruktur und verwenden Bild-IDs als Dateinamen. Zum Beispiel wird ein Bild mit
id=1234567
platziertVerwenden Sie die letzten 4 Ziffern, um zu bestimmen, wohin die Datei geht.
Mit einigen tausend Bildern könnten Sie eine einstufige Hierarchie verwenden. Unser Systemadministrator schlug nicht mehr als ein paar tausend Dateien in einem bestimmten Verzeichnis (ext3) vor, um die Effizienz / Sicherung / aus welchen anderen Gründen auch immer.
quelle
Für das, was es wert ist, habe ich gerade ein Verzeichnis in einem
ext4
Dateisystem mit 1.000.000 Dateien erstellt und dann über einen Webserver zufällig auf diese Dateien zugegriffen. Ich habe keine Prämie beim Zugriff auf diejenigen bemerkt, die nur 10 Dateien haben.Das ist radikal von meiner Erfahrung vor
ntfs
einigen Jahren.quelle
Das größte Problem, auf das ich gestoßen bin, ist ein 32-Bit-System. Sobald Sie eine bestimmte Zahl überschritten haben, funktionieren Tools wie 'ls' nicht mehr.
Der Versuch, mit diesem Verzeichnis etwas zu tun, sobald Sie diese Barriere überschritten haben, wird zu einem großen Problem.
quelle
Ich habe das gleiche Problem gehabt. Der Versuch, Millionen von Dateien auf einem Ubuntu-Server in ext4 zu speichern. Ich habe meine eigenen Benchmarks beendet. Es wurde festgestellt, dass das flache Verzeichnis eine viel bessere Leistung erbringt und gleichzeitig viel einfacher zu verwenden ist:
Schrieb einen Artikel .
quelle
Wenn der Zeitaufwand für die Implementierung eines Verzeichnispartitionierungsschemas minimal ist, bin ich dafür. Wenn Sie zum ersten Mal ein Problem debuggen müssen, bei dem ein Verzeichnis mit 10000 Dateien über die Konsole bearbeitet wird, werden Sie verstehen.
In F-Spot werden beispielsweise Fotodateien als JJJJ \ MM \ TT \ Dateiname.ext gespeichert. Dies bedeutet, dass das größte Verzeichnis, mit dem ich mich bei der manuellen Bearbeitung meiner ~ 20000-Fotosammlung befassen musste, etwa 800 Dateien umfasst. Dadurch können die Dateien auch leichter von einer Drittanbieteranwendung aus durchsucht werden. Gehen Sie niemals davon aus, dass Ihre Software das einzige ist, das auf die Dateien Ihrer Software zugreift.
quelle
Es kommt absolut auf das Dateisystem an. Viele moderne Dateisysteme verwenden anständige Datenstrukturen, um den Inhalt von Verzeichnissen zu speichern, aber ältere Dateisysteme fügten die Einträge häufig nur einer Liste hinzu, sodass das Abrufen einer Datei eine O (n) -Operation war.
Selbst wenn das Dateisystem es richtig macht, ist es für Programme, die Verzeichnisinhalte auflisten, absolut möglich, Fehler zu machen und eine O (n ^ 2) -Sortierung durchzuführen. Um auf der sicheren Seite zu sein, würde ich immer die Anzahl der Dateien pro Datei begrenzen Verzeichnis auf nicht mehr als 500.
quelle
Es hängt wirklich vom verwendeten Dateisystem und einigen Flags ab.
Zum Beispiel kann ext3 viele tausend Dateien haben; aber nach ein paar tausend war es sehr langsam. Meistens beim Auflisten eines Verzeichnisses, aber auch beim Öffnen einer einzelnen Datei. Vor einigen Jahren erhielt es die Option 'htree', die die Zeit, die benötigt wird, um eine Inode mit einem Dateinamen zu erhalten, drastisch verkürzte.
Persönlich verwende ich Unterverzeichnisse, um die meisten Ebenen unter etwa tausend Elementen zu halten. In Ihrem Fall würde ich 256 Verzeichnisse mit den beiden letzten hexadezimalen Ziffern der ID erstellen. Verwenden Sie die letzte und nicht die erste Ziffer, damit die Last ausgeglichen wird.
quelle
ext3 hat tatsächlich Verzeichnisgrößenbeschränkungen, die von der Blockgröße des Dateisystems abhängen. Es gibt keine "maximale Anzahl" von Dateien pro Verzeichnis, sondern eine "maximale Anzahl von Blöcken, die zum Speichern von Dateieinträgen verwendet werden" pro Verzeichnis. Insbesondere kann die Größe des Verzeichnisses selbst nicht über einen B-Baum der Höhe 3 hinaus wachsen, und das Fanout des Baums hängt von der Blockgröße ab. Siehe diesen Link für einige Details.
https://www.mail-archive.com/[email protected]/msg01944.html
Dies hat mich kürzlich auf ein mit 2K-Blöcken formatiertes Dateisystem gebissen, das
warning: ext3_dx_add_entry: Directory index full!
beim Kopieren aus einem anderen ext3-Dateisystem unerklärlicherweise verzeichnisreiche Kernel-Nachrichten erhielt . In meinem Fall konnte ein Verzeichnis mit nur 480.000 Dateien nicht an das Ziel kopiert werden.quelle
Die Frage hängt davon ab, was Sie mit den Dateien tun werden.
Unter Windows wird jedes Verzeichnis mit mehr als 2.000 Dateien im Explorer für mich langsam geöffnet. Wenn es sich um alle Bilddateien handelt, öffnen sich mehr als 1 KB in der Miniaturansicht sehr langsam.
Zu einer Zeit betrug das vom System auferlegte Limit 32.767. Es ist jetzt höher, aber selbst das sind unter den meisten Umständen viel zu viele Dateien, um sie gleichzeitig zu verarbeiten.
quelle
Was die meisten der obigen Antworten nicht zeigen, ist, dass es keine Antwort auf die ursprüngliche Frage "Einheitsgröße" gibt.
In der heutigen Umgebung haben wir ein großes Konglomerat unterschiedlicher Hardware und Software - einige sind 32-Bit, einige sind 64-Bit, einige sind auf dem neuesten Stand und einige sind bewährt - zuverlässig und ändern sich nie. Hinzu kommen eine Vielzahl älterer und neuerer Hardware, ältere und neuere Betriebssysteme, verschiedene Anbieter (Windows, Unixes, Apple usw.) sowie eine Vielzahl von Dienstprogrammen und Servern. Da sich die Hardware verbessert und die Software auf 64-Bit-Kompatibilität umgestellt hat, hat es notwendigerweise erhebliche Verzögerungen gegeben, alle Teile dieser sehr großen und komplexen Welt dazu zu bringen, mit dem schnellen Tempo der Änderungen gut zu spielen.
IMHO gibt es keine Möglichkeit, ein Problem zu beheben. Die Lösung besteht darin, die Möglichkeiten zu erforschen und dann durch Ausprobieren herauszufinden, was für Ihre speziellen Anforderungen am besten geeignet ist. Jeder Benutzer muss bestimmen, was für sein System funktioniert, anstatt einen Cookie-Cutter-Ansatz zu verwenden.
Ich habe zum Beispiel einen Medienserver mit ein paar sehr großen Dateien. Das Ergebnis sind nur etwa 400 Dateien, die ein 3-TB-Laufwerk füllen. Es wird nur 1% der Inodes verwendet, aber 95% des gesamten Speicherplatzes. Jemand anderem mit vielen kleineren Dateien gehen möglicherweise die Inodes aus, bevor sie sich dem Ausfüllen des Speicherplatzes nähern. (Auf ext4-Dateisystemen wird als Faustregel 1 Inode für jede Datei / jedes Verzeichnis verwendet.) Während theoretisch die Gesamtzahl der Dateien, die in einem Verzeichnis enthalten sein können, nahezu unendlich ist, bestimmt die Praktikabilität, dass die Gesamtnutzung realistische Einheiten bestimmt, nicht nur Dateisystemfunktionen.
Ich hoffe, dass all die verschiedenen Antworten oben das Denken und Lösen von Problemen gefördert haben, anstatt ein unüberwindbares Hindernis für den Fortschritt darzustellen.
quelle
Ich erinnere mich, dass ich ein Programm ausgeführt habe, das am Ausgang eine große Anzahl von Dateien erstellt hat. Die Dateien wurden nach 30000 pro Verzeichnis sortiert. Ich kann mich nicht erinnern, Leseprobleme gehabt zu haben, als ich die produzierte Ausgabe wiederverwenden musste. Es befand sich auf einem 32-Bit-Ubuntu-Linux-Laptop, und sogar Nautilus zeigte den Verzeichnisinhalt an, wenn auch nach einigen Sekunden.
ext3-Dateisystem: Ähnlicher Code auf einem 64-Bit-System hat sich gut mit 64000 Dateien pro Verzeichnis befasst.
quelle
"Abhängig vom Dateisystem"
Einige Benutzer erwähnten, dass die Auswirkungen auf die Leistung vom verwendeten Dateisystem abhängen. Na sicher. Dateisysteme wie EXT3 können sehr langsam sein. Aber selbst wenn Sie EXT4 oder XFS verwenden, können Sie nicht verhindern, dass ein Ordner durch
ls
oder aufgelistet wirdfind
oder über eine externe Verbindung wie FTP wird langsamer werden ein langsamer.Lösung
Ich bevorzuge den gleichen Weg wie @armandino . Dafür verwende ich diese kleine Funktion in PHP, um IDs in einen Dateipfad zu konvertieren, der 1000 Dateien pro Verzeichnis ergibt:
oder Sie können die zweite Version verwenden, wenn Sie alphanumerische Zeichen verwenden möchten:
Ergebnisse:
Wie Sie für die sehen können
$int
-version sehen können, enthält jeder Ordner bis zu 1000 Dateien und bis zu 99 Verzeichnisse mit 1000 Dateien und 99 Verzeichnissen ...Vergessen Sie aber nicht, dass zu viele Verzeichnisse die gleichen Leistungsprobleme verursachen!
Schließlich sollten Sie darüber nachdenken, wie Sie die Anzahl der Dateien insgesamt reduzieren können. Abhängig von Ihrem Ziel können Sie CSS-Sprites verwenden, um mehrere kleine Bilder wie Avatare, Symbole, Smilies usw. zu kombinieren. Wenn Sie viele kleine Nicht-Mediendateien verwenden, sollten Sie diese beispielsweise im JSON-Format kombinieren. In meinem Fall hatte ich Tausende von Mini-Caches und schließlich entschied ich mich, sie in 10er-Packs zu kombinieren.
quelle
Ich respektiere, dass dies Ihre Frage, wie viele zu viele sind, nicht vollständig beantwortet. Eine Idee zur Lösung des Langzeitproblems ist jedoch, dass Sie neben dem Speichern der ursprünglichen Dateimetadaten auch den Ordner auf der Festplatte speichern, in dem er gespeichert ist - normalisieren aus diesem Stück Metadaten. Sobald ein Ordner eine Grenze überschreitet, mit der Sie aus Gründen der Leistung, Ästhetik oder aus irgendeinem Grund vertraut sind, erstellen Sie einfach einen zweiten Ordner und legen dort Dateien ab ...
quelle
Ich bin auf ein ähnliches Problem gestoßen. Ich habe versucht, auf ein Verzeichnis mit über 10.000 Dateien zuzugreifen. Es dauerte zu lange, um die Dateiliste zu erstellen und beliebige Befehle für eine der Dateien auszuführen.
Ich habe mir ein kleines PHP-Skript ausgedacht, um dies für mich selbst zu tun, und versucht, einen Weg zu finden, um eine Zeitüberschreitung im Browser zu verhindern.
Das folgende ist das PHP-Skript, das ich geschrieben habe, um das Problem zu beheben.
Auflisten von Dateien in einem Verzeichnis mit zu vielen Dateien für FTP
Wie es jemandem hilft
quelle
Keine Antwort, sondern nur ein paar Vorschläge.
Wählen Sie ein geeigneteres FS (Dateisystem). Aus historischer Sicht waren alle Ihre Probleme klug genug, um einst für FSs von zentraler Bedeutung zu sein, die sich über Jahrzehnte entwickelt haben. Ich meine, modernere FS unterstützen Ihre Probleme besser. Erstellen Sie zunächst eine Vergleichsentscheidungstabelle, die auf Ihrem endgültigen Zweck basiert FS-Liste .
Ich denke, es ist Zeit, Ihre Paradigmen zu ändern. Also schlage ich persönlich vor, ein verteiltes systembewusstes FS zu verwenden , was in Bezug auf Größe, Anzahl der Dateien usw. keinerlei Einschränkungen bedeutet. Andernfalls werden Sie früher oder später durch neue unerwartete Probleme herausgefordert.
Ich bin mir nicht sicher, ob ich funktionieren werde, aber wenn Sie keine Experimente erwähnen, probieren Sie AUFS über Ihr aktuelles Dateisystem aus. Ich denke, es hat Möglichkeiten, mehrere Ordner als einen einzigen virtuellen Ordner nachzuahmen.
Um Hardware-Limits zu überwinden, können Sie RAID-0 verwenden.
quelle
Es gibt keine einzelne Zahl, die "zu viele" ist, solange sie die Grenzen des Betriebssystems nicht überschreitet. Je mehr Dateien sich in einem Verzeichnis befinden, unabhängig vom Betriebssystem, desto länger dauert der Zugriff auf eine einzelne Datei. Bei den meisten Betriebssystemen ist die Leistung nicht linear. Das Auffinden einer von 10.000 Dateien dauert also mehr als zehnmal länger dann, um eine Datei in 1.000 zu finden.
Zu den sekundären Problemen, die mit vielen Dateien in einem Verzeichnis verbunden sind, gehören Platzhalter-Erweiterungsfehler. Um das Risiko zu verringern, können Sie Ihre Verzeichnisse nach dem Datum des Uploads oder nach anderen nützlichen Metadaten sortieren.
quelle