'ls' Befehl sehr langsam

431
tytywin

Ich habe ungefähr 17k Dateien in einem Verzeichnis. Wenn ich renne ls directory, muss ich etwa 15-20 Sekunden warten, bevor die Ergebnisse angezeigt werden. Auf der anderen Seite, wenn ich laufen ls directory | wc -loder ls directory | grep .xyzwerden die Ergebnisse sofort angezeigt.

Warum passiert das und gibt es eine Möglichkeit, dies zu beheben?

0
Dies geschieht, weil sich im Verzeichnis 17k-Dateien befinden. Die Lösung besteht darin, weniger Dateien im Verzeichnis zu haben. Ignacio Vazquez-Abrams vor 5 Jahren 1
Der Druck auf die Konsole ist immer langsam. Wenn OTOH die Daten durch eine Pipe leitet, bleibt die Ausgabe im Arbeitsspeicher oder in der Datei, sodass sie wesentlich schneller ist phuclv vor 5 Jahren 0
Dieses Problem hängt mit dem Anzeigepuffer (?) Der Konsole zusammen. Die "Langsamkeit" kommt von der Ausgabe der Daten durch den Puffer, nicht vom Befehl selbst. confetti vor 5 Jahren 0
@ IgnacioVazquez-Abrams Was ist, wenn Sie ein ML-Ingenieur sind? tytywin vor 5 Jahren 0
Ich würde einen besseren Weg finden, um die Daten zu organisieren. Ignacio Vazquez-Abrams vor 5 Jahren 0

2 Antworten auf die Frage

2
grawity

Ich vermute, dass Sie Linux verwenden.

  1. Wenn Ihr lsBefehl so gestaltet ist, dass Dateien und Ordner in Farbe angezeigt werden, muss er die Berechtigungen jedes Elements (einen stat () - Aufruf) ermitteln und feststellen, ob er über "Dateifunktionen" (einen getxattr () - Aufruf) verfügt die richtige Farbe wählen. Je nach Dateisystem können diese Aufrufe ziemlich langsam sein, wenn die erforderlichen Metadaten noch nicht im RAM zwischengespeichert wurden. [Erweiterte Attribute leben häufig im Datenbereich, sodass bei jedem getxattr-Ergebnis HDD-Suchvorgänge ausgeführt werden.]

    Auf der anderen Seite, ls |wenn sie auf ein Rohr umgeleitet automatisch deaktiviert Färbung, so dass es nicht mehr irgendwelche zusätzliche Kontrollen tun muss - nur eine einfache readdir () Schleife, die die Dateinamen und Typen zurückgibt, und die Kernel wahrscheinlich sogar Geräte lesen grünes Licht für Das.

  2. Normalerweise werden lsdie Ausgaben in Spalten zusammengefasst. Das bedeutet, dass das gesamte Verzeichnis gelesen werden muss, bevor es überhaupt etwas ausgeben kann. Beim Durchlaufen einer Pipe wird der Spaltenmodus automatisch deaktiviert, und diese Pufferung ist nicht mehr erforderlich. (Die Gesamtlaufzeit ist nicht notwendigerweise schneller, aber die Ausgabe beginnt früher und fühlt sich dadurch schneller an.)

Verwenden Sie straceoder perf trace, um zu überprüfen, welche Systemaufrufe, wenn überhaupt, lange dauern.

0
Kamil Maciorowski

Zwei Dinge:

  1. Wenn Sie lszuerst und ls | wc -lspäter ausführen, ist es möglich, dass der Erstere von Ihrer Festplatte und der Zwischenspeicher zwischengespeicherte Daten liest. Wenn ja, ls"stallt" zunächst ein und druckt für einige Sekunden nichts. Ein anderer lsDrucker wird fast sofort mit dem Drucken beginnen, solange die zwischengespeicherten Daten noch vorhanden sind. Wenn Sie mit beginnen ls | wc -lin erster Linie, es würde warten müssen für HDD Daten zu versorgen.
  2. Jedes Terminal arbeitet mit seiner eigenen Geschwindigkeit. Formal stty speedwird Ihnen ein gewisser Wert gezeigt, aber ich denke, dass es für ein virtuelles Terminal keine Rolle spielt. Die Anzeige von Zeichen und das Scrollen dauert jedoch etwas länger (siehe diese Frage ). Das Weiterleiten der gleichen Daten durch eine Pipe ist schneller.