60000 ist nichts, 20000 auch. Aber Sie sollten diese 20000 auf jeden Fall gruppieren, um den Zugriff darauf zu beschleunigen. Vielleicht in Gruppen von 100 oder 1000, indem man die Nummer des Verzeichnisses nimmt und sie durch 100, 500, 1000, was auch immer, teilt.
Ich habe z. B. ein Projekt, bei dem die Dateien Nummern haben. Ich gruppiere sie in 1000er, also habe ich
id/1/1332
id/3/3256
id/12/12334
id/350/350934
Möglicherweise haben Sie tatsächlich eine feste Grenze - einige Systeme haben 32-Bit-Inodes, sodass Sie auf eine Anzahl von 2^32 pro Dateisystem beschränkt sind.
Wenn das Dateisystem Ihres Servers den dir_index
hat Funktion eingeschaltet (siehe tune2fs(8)
Einzelheiten zum Überprüfen und Aktivieren der Funktion), dann können Sie vernünftigerweise mehr als 100.000 Dateien in einem Verzeichnis speichern, bevor die Leistung abnimmt. (dir_index
ist für die meisten Distributionen seit einigen Jahren der Standard für neue Dateisysteme, also wäre es nur ein altes Dateisystem, das die Funktion standardmäßig nicht aktiviert hat.)
Das Hinzufügen einer weiteren Verzeichnisebene, um die Anzahl der Dateien in einem Verzeichnis um den Faktor 16 oder 256 zu reduzieren, würde die Chancen für Dinge wie ls *
drastisch verbessern funktioniert, ohne das Kernel-Maximum argv
zu überschreiten Größe.
Typischerweise geschieht dies durch etwas wie:
/a/a1111
/a/a1112
...
/b/b1111
...
/c/c6565
...
Das heißt, dem Pfad einen Buchstaben oder eine Ziffer voranstellen, basierend auf einer Funktion, die Sie aus dem Namen berechnen können. (Die ersten beiden Zeichen von md5sum
oder sha1sum
des Dateinamens ist ein gängiger Ansatz, aber wenn Sie eindeutige Objekt-IDs haben, dann 'a'+ id % 16
ist ein einfacher Mechanismus, um zu bestimmen, welches Verzeichnis verwendet werden soll.)
ext[234]-Dateisysteme haben eine feste maximale Anzahl von Inodes; jede Datei oder jedes Verzeichnis benötigt einen Inode. Sie können die aktuelle Anzahl und Limits mit df -i
sehen . Zum Beispiel auf einem 15-GB-ext3-Dateisystem, das mit den Standardeinstellungen erstellt wurde:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda 1933312 134815 1798497 7% /
Darüber hinaus gibt es insbesondere für Verzeichnisse keine Beschränkung; Denken Sie jedoch daran, dass jede Datei oder jedes Verzeichnis mindestens einen Dateisystemblock (normalerweise 4 KB) benötigt, selbst wenn es sich um ein Verzeichnis mit nur einem einzigen Element handelt.
Wie Sie sehen können, sind 80.000 Inodes jedoch wahrscheinlich kein Problem. Und mit der dir_index
Option (aktivierbar mit tune2fs
), Suchen in großen Verzeichnissen sind keine allzu große Sache. Beachten Sie jedoch, dass viele Verwaltungstools (wie ls
oder rm
) kann es schwer haben, mit Verzeichnissen umzugehen, die zu viele Dateien enthalten. Daher wird empfohlen, Ihre Dateien so aufzuteilen, dass Sie nicht mehr als ein paar hundert bis tausend Elemente in einem bestimmten Verzeichnis haben. Eine einfache Möglichkeit, dies zu tun, besteht darin, die von Ihnen verwendete ID zu hashen und die ersten paar Hexadezimalziffern als Zwischenverzeichnisse zu verwenden.
Angenommen, Sie haben die Artikel-ID 12345 und sie wird zu 'DEADBEEF02842.......'
gehasht . Sie können Ihre Dateien unter /storage/root/d/e/12345
speichern . Sie haben jetzt die Anzahl der Dateien in jedem Verzeichnis um 1/256 reduziert.