Gibt es eine Einschränkung für viele Dateien in einem Verzeichnis unter Mac OS X?

9

Ich habe mehr als 100.000 Dateien in einem Verzeichnis in meinem MacOS X und es sieht so aus, als würde mein Skript nur langsam eine Datei darin lesen.

Gibt es eine Einschränkung oder Empfehlung, so viele Dateien zu haben? Soll ich sie in einige Verzeichnisse aufteilen?

Die Einschränkung, die ich gefunden habe, war, dass ich nicht mv * foofür alle 100.000 Dateien kann. Es zeigt einen Fehler mit der Aufschrift "zu langes Argument". Es funktioniert mit ungefähr weniger als 20.000 Dateien.

Daisuki Honig
quelle
Derzeit habe ich 380.000 Dateien in einem Verzeichnis und stelle fest, dass selbst das Öffnen einer Datei mehr als 10 Sekunden dauert. Ich habe beschlossen, sie in einige Verzeichnisse zu unterteilen.
Daisuki Honey
1
Das HFS + -Dateisystem sollte in der Lage sein, eine große Anzahl von Dateien in einem Verzeichnis unter ihrem vollständigen Namen ohne großen Aufwand zu speichern und darauf zuzugreifen. Aber Sie müssen mit Platzhaltern aufpassen. Wenn Sie *oder ?als Teil eines Arguments für einen Befehl verwenden, durchsucht das Betriebssystem das gesamte Verzeichnis nach übereinstimmenden Dateien (langsam) und ersetzt Ihr Argument durch eine Liste aller übereinstimmenden Dateien (lang), die es dann an die übergibt Befehl. Sie können es besser mit einer Schleife oder mit mehreren mv-Befehlen machen, z mv a* foo && mv b* foo.
Matthias Fripp

Antworten:

1

Laut dieser Antwort zum Stapelüberlauf und spezifischen Details auf der Apple-Website kann ein einzelner Ordner bis zu 2,1 Milliarden Elemente enthalten.

Nur weil es bis zu 2,1 Milliarden Artikel aufnehmen kann, bedeutet dies nicht, dass die Leistung auf diesem Niveau gehalten werden kann. Laut Wikipedia ; Der Schwerpunkt liegt bei mir:

Die Katalogdatei, in der alle Datei- und Verzeichnisdatensätze in einer einzigen Datenstruktur gespeichert sind, führt zu Leistungsproblemen, wenn das System Multitasking zulässt, da jeweils nur ein Programm in diese Struktur schreiben kann, was bedeutet, dass möglicherweise viele Programme in der Warteschlange warten aufgrund eines Programms "hogging" das System. Dies ist auch ein ernstes Problem für die Zuverlässigkeit, da eine Beschädigung dieser Datei das gesamte Dateisystem zerstören kann.

Daher wird die Leistung natürlich beeinträchtigt, da die Katalogdatei jeweils nur von einem Programm verwendet werden kann. Und wenn das Verzeichnis größer wird, eskaliert das durch dieses Problem verursachte Risiko / die Verschlechterung nur. Mehr Dateien bedeuten für Programme eine größere Chance, auf Dateien in diesem einen Verzeichnis zuzugreifen. Weitere Bestätigung dieser Idee hier ; wieder liegt der Schwerpunkt bei mir:

Die Katalogdatei ist eine komplizierte Struktur. Da alle Datei- und Verzeichnisinformationen gespeichert werden, wird die Serialisierung des Dateisystems erzwungen - keine ideale Situation, wenn eine große Anzahl von Threads Datei-E / A ausführen möchte. In HFS muss jeder Vorgang, der eine Datei erstellt oder eine Datei auf irgendeine Weise ändert, die Katalogdatei sperren, wodurch verhindert wird, dass andere Threads auch nur schreibgeschützt auf die Katalogdatei zugreifen können. Der Zugriff auf die Katalogdatei muss Single-Writer / Multireader sein.

JakeGould
quelle
Vielen Dank. Ich verstehe, dass der Zugriff auf die Katalogdatei der Engpass sein wird und insbesondere bei Multitasking ernsthafte Leistungsprobleme verursachen kann.
Daisuki Honey
@DaisukiHoney Gern geschehen! Wenn Sie meine Antwort hilfreich fanden, denken Sie bitte daran, sie abzustimmen. Und wenn es die Antwort war, die Ihr Problem gelöst hat, denken Sie bitte daran, es als solches abzuhaken.
JakeGould
Ja, auf jeden Fall stimme ich über Ihre Antwort ab und kreuze sie an. Nochmals vielen Dank.
Daisuki Honey
In den von Ihnen zitierten Wikipedia-Abschnitten geht es um Skalierbarkeitsbeschränkungen pro Dateisystem und nicht pro Verzeichnis: Es gibt nur eine Katalogdatei pro Dateisystem, und jeder Zugriff muss darauf serialisiert werden. Es ist ziemlich irrelevant für die Frage.
Poolie
@poolie Die Frage bezieht sich auf ein Verzeichnis, das in einem Dateisystem vorhanden ist. Die Katalogdatei existiert pro Dateisystem, aber das Verzeichnis selbst existiert auch auf demselben Dateisystem. Dies ist relevant für eine Frage, die sich mit mehr als 10.000 Dateien in einem Verzeichnis befasst, das in einem einzelnen Dateisystem vorhanden ist. Aber diese Frage ist 2+ Jahre alt, also danke für den Wiki-Link. Ich habe meine Antwort aktualisiert, um den neuen Wortlaut sowie einen direkten Link zu dem betreffenden Abschnitt aufzunehmen.
JakeGould
4

Kurze Antwort: Wenn Sie 100.000 Dateien lesen, kann ich davon ausgehen, dass das Skript langsam ist.

Lange Antwort: Um diese Frage genauer zu beantworten, müssen Sie sich das Dateisystem auf einem Mac ansehen. Macs verwenden das HFS + ( Hierarchical File System Plus ), ein modernes Dateisystem mit Einschränkungen, jedoch nur in extremen Situationen.

Nach meiner Erfahrung ähnelt es einem Linux EXT-Journaling-Dateisystem. Es unterstützt das Mounten von Verzeichnissen, UNIX-ähnlichen Berechtigungen usw. Es adressierte Dateien in einem 32-Bit-Format, sodass laut dieser Quelle die maximale Anzahl von Dateien auf einem Volume von 4.294.967.295 gespeichert werden kann .

Das Dateisystem beginnt mit Dateien zu brechen, die auf modernen Systemen größer als 8 EB sind, und bis zu 2,1 Milliarden Dateien und Ordner an einem Ort, wie hier beschrieben .

Angesichts der Art und Weise, wie das HFS + - oder wirklich jedes Dateisystem - eingerichtet ist, sollten viele Dateien in einem Ordner nichts „Seltsames“ bewirken.

Ehrlich gesagt glaube ich nicht, dass es eine Leistungsverbesserung geben würde, wenn die Dateien auf eine komplexere Ordnerhierarchie verteilt würden. Tatsächlich ist diese Technik möglicherweise weniger effizient, da Ihr Skript während des Prozesses Aufrufe zum Ändern von Verzeichnissen ausführen müsste.

James Taylor
quelle
Recht. Ich habe darüber nachgedacht, die Verzeichnishierarchie zu ändern, aber dies führt zu einem komplizierteren Algorithmus, und ich vermute, dass sich die Leistung erheblich verbessert. Danke für die Antwort. Ich habe derzeit 200.000 Dateien im Verzeichnis und möglicherweise 1.000.000 am Ende. Ich hoffe, es funktioniert gut ohne diese schlechte Leistung.
Daisuki Honey
@DaisukiHoney Wenn Sie mit so vielen Dateien arbeiten, lohnt es sich möglicherweise zu prüfen, ob Sie die Dinge in Verzeichnisse unterteilen können. Könnte in dieser Phase schwierig sein, könnte aber die Dinge in Zukunft etwas stabiler machen.
JakeGould
@ JakeGould Danke für den Rat. Ich habe über eine Umstrukturierung nachgedacht, weil ich möglicherweise weitere Dateien hinzufügen könnte. Vielen Dank.
Daisuki Honey