Ich habe ein Verzeichnis mit ca. 100000 kleinen Dateien (jede Datei besteht aus 1-3 Zeilen, jede Datei ist eine Textdatei). In der Größe ist das Verzeichnis nicht sehr groß (<2 GB). Diese Daten befinden sich auf einem professionell verwalteten NFS-Server. Auf dem Server läuft Linux. Ich denke, das Dateisystem ist ext3, aber ich weiß es nicht genau. Außerdem habe ich keinen Root-Zugriff auf den Server.
Diese Dateien sind das Ergebnis eines groß angelegten wissenschaftlichen Experiments, über das ich keine Kontrolle habe. Ich muss jedoch die Ergebnisse analysieren.
Jede E / A-Operation / -Verarbeitung in diesem Verzeichnis ist sehr, sehr langsam. Das Öffnen einer Datei (Fopen in Python), das Lesen aus einer geöffneten Datei und das Schließen einer Datei sind alle sehr langsam. In bash ls, du usw. nicht funktionieren.
Die Frage ist:
Was ist die maximale Anzahl von Dateien in einem Verzeichnis in Linux, so dass es praktisch ist, zu verarbeiten, zu öffnen, zu lesen usw.? Ich verstehe, dass die Antwort von vielen Dingen abhängt: fs-Typ, Kernel-Version, Serverversion, Hardware usw. Ich möchte nur eine Faustregel, wenn möglich.
quelle
Antworten:
Wie Sie vermuten, hängt es von vielen Dingen ab, hauptsächlich vom Typ und den Optionen des Dateisystems und in gewissem Maße von der Kernel-Version. In der ext2 / ext3 / ext4-Reihe gab es eine wesentliche Verbesserung, als die
dir_index
Option erschien (einige Zeit nach der Erstveröffentlichung von ext3): Verzeichnisse werden als Suchbäume (logarithmischer Zeitzugriff) und nicht als lineare Listen (linearer Zeitzugriff) gespeichert ). Das können Sie nicht über NFS sehen, aber wenn Sie Kontakt zu den Administratoren haben, können Sie sie bitten, das Programm auszuführentune2fs -l /dev/something |grep features
(vielleicht sogar davon zu überzeugen, ein Upgrade durchzuführen?). Es kommt nur auf die Anzahl der Dateien an, nicht auf deren Größe.Trotzdem
dir_index
fühlt sich 100000 groß an. Holen Sie sich im Idealfall die Autoren des Programms, das die Dateien erstellt, um eine Ebene von Unterverzeichnissen hinzuzufügen. Für ext2 oder ext3 ohnedir_index
und 20000 mitdir_index
oder reiserfs würde ich ein Limit von etwa 1000 Dateien pro Verzeichnis empfehlen, damit die Leistung nicht beeinträchtigt wird. Wenn Sie nicht steuern können, wie die Dateien erstellt werden, verschieben Sie sie in separate Verzeichnisse, bevor Sie etwas anderes tun.quelle