Ich hatte ein Verzeichnis mit ungefähr 5 Millionen Dateien. Als ich versuchte, den ls
Befehl in diesem Verzeichnis auszuführen, verbrauchte mein System sehr viel Speicher und blieb nach einiger Zeit hängen. Gibt es eine effiziente Möglichkeit, die Dateien anders als mit dem ls
Befehl aufzulisten?
70
ls
das verwendet--color
oder-F
als das würde bedeuten, ein tunlstat(2)
für jede Datei.ls
Anruf oder haben Sie Optionen verwendet?Antworten:
Vermeiden Sie das Sortieren mit:
Oder äquivalent:
quelle
-1
Flagge könnte helfen.-1
dauert noch länger.-C
wenn stdout ein Terminal ist,-1
wenn es eine Pipe ist) ist verwirrend. Wenn Sie experimentieren und messen, wechseln Sie zwischen dem Anzeigen der Ausgabe (um sicherzustellen, dass der Befehl das tut, was Sie erwarten) und dem Unterdrücken der Ausgabe (um den verwirrenden Faktor des Durchsatzes der Terminalanwendung zu vermeiden). Bessere Befehle zu verwenden , die in beiden Modi auf die gleiche Art und Weise verhalten, so ausdrücklich das Ausgabeformat über definieren-1
,-C
,-l
etc.ls
sortiert die Dateien tatsächlich und versucht, sie aufzulisten, was zu einem enormen Overhead wird, wenn wir versuchen, mehr als eine Million Dateien in einem Verzeichnis aufzulisten. Wie in diesem Link erwähnt, können wir die Dateien mitstrace
oderfind
auflisten. Diese Optionen schienen jedoch auch für mein Problem nicht realisierbar zu sein, da ich 5 Millionen Dateien hatte. Nach einiger bisschen googeln, fand ich , dass , wenn wir die Verzeichnisse mit der Anwendunggetdents()
wird angenommen , schneller zu sein, weills
,find
undPython
Bibliotheken verwenden ,readdir()
die langsamer ist, verwendet abergetdents()
darunter.Wir können den C - Code finden Sie die Dateien mit zur Liste
getdents()
von hier :Kopieren Sie das obige C-Programm in das Verzeichnis, in dem die Dateien aufgelistet werden müssen. Führen Sie dann die folgenden Befehle aus.
Beispiel für Timings :
getdents
Kannls -f
je nach Systemkonfiguration viel schneller sein als . Im Folgenden sind einige Zeitangaben aufgeführt, die eine 40-fache Geschwindigkeitssteigerung beim Auflisten eines Verzeichnisses mit ca. 500.000 Dateien über einen NFS-Mount in einem Compute-Cluster demonstrieren. Jeder Befehl wurde 10 Mal unmittelbar nacheinander ausgeführt werden , zuerstgetdents
, dannls -f
. Die erste Ausführung ist bedeutend langsamer als alle anderen, wahrscheinlich aufgrund von Fehlern bei der NFS-Caching-Seite. (Abgesehen davon: Über diesen Mount ist dasd_type
Feld unzuverlässig, da viele Dateien als "unbekannter" Typ angezeigt werden.)quelle
ls
?getdents
vs geht amreaddir
Rande vorbei.Der wahrscheinlichste Grund, warum es langsam ist, ist das Färben von Dateitypen. Sie können dies vermeiden, indem Sie die Farboptionen aktivieren
\ls
oder/bin/ls
deaktivieren.Wenn Sie wirklich so viele Dateien in einem Verzeichnis haben, ist die Verwendung
find
auch eine gute Option.quelle
ls -U --color
würde es lange dauern, da es fürstat
jede Datei erforderlich ist. Also sind beide richtig.ls
und ist in vielen Fällen standardmäßig verzerrt.bashrc
./bin/ls -U
und wurde in kürzester Zeit ausgegeben, verglichen mit dem langen Warten davorIch finde,
echo *
das geht viel schneller als ls. YMMV.quelle
*
. Daher ist dieser Weg für 5 Millionen Dateien wahrscheinlich immer noch sehr langsam.