Ich hatte ein Verzeichnis mit einer großen Anzahl von Dateien. Jedes Mal, wenn ich versuchte, auf die Liste der darin enthaltenen Dateien zuzugreifen, war ich nicht in der Lage, dies zu tun, oder es gab erhebliche Verzögerungen. Ich habe versucht, ls
-Befehl innerhalb der Kommandozeile auf Linux zu verwenden und die Web-Schnittstelle von meinem Hosting-Provider hat auch nicht geholfen.
Das Problem ist, dass wenn ich nur ls
mache, es viel Zeit braucht, um überhaupt etwas anzuzeigen. Also, ls | wc -l
würde auch nicht helfen.
Nach einigen Recherchen habe ich diesen Code entwickelt (in diesem Beispiel zählt er die Anzahl der neuen E-Mails auf einem Server):
%Vor%Der obige Code ist in Python geschrieben. Ich habe Pythons Kommandozeilen-Tool verwendet und es hat ziemlich schnell funktioniert (das Ergebnis wurde sofort zurückgegeben).
Ich bin an der Antwort auf die folgende Frage interessiert: Ist es möglich, Dateien in einem Verzeichnis (ohne Unterverzeichnisse) schneller zu zählen? Was ist der schnellste Weg, das zu tun?
ls
ruft einen stat(2)
Aufruf für jede Datei auf. Andere Tools, wie find(1)
und die Shell-Wildcard-Erweiterung, können diesen Aufruf umgehen und tun einfach readdir
. Eine Shell-Befehlskombination, die funktionieren könnte, ist find dir -maxdepth 1|wc -l
, aber sie listet das Verzeichnis selbst gerne auf und mißt jeden Dateinamen mit einer neuen Zeile darin.
In Python ist der direkte Weg, um nur diese Namen zu erhalten, os.listdir (Verzeichnis) . Im Gegensatz zu os.walk und os.path.walk muss es nicht rekursiv sein, Dateitypen überprüfen oder weitere Python-Funktionsaufrufe ausführen.
Nachtrag: Es scheint, dass ls nicht immer Stat. Zumindest auf meinem GNU-System kann es nur einen getdents-Aufruf ausführen, wenn weitere Informationen (z. B. welche Namen Verzeichnisse sind) nicht angefordert werden. getdents ist der zugrunde liegende Systemaufruf, der zur Implementierung von readdir in GNU / Linux verwendet wird.
Zusatz 2: Ein Grund für eine Verzögerung, bevor ls Ergebnisse ausgibt, ist das Sortieren und Tabellieren. ls -U1 kann dies vermeiden.
Ich denke, ls
verbringt die meiste Zeit damit, die erste Zeile anzuzeigen, da die Einträge sortiert werden müssen. Daher sollte ls -U
die erste Zeile viel schneller anzeigen (obwohl es möglicherweise nicht viel besser ist). .
Der schnellste Weg wäre, den Overhead der interpretierten Sprachen zu vermeiden und Code zu schreiben, der Ihr Problem direkt anspricht. Dies ist auf portable Weise schwierig, aber ziemlich einfach. Im Moment bin ich auf einer OS X-Box, aber die Konvertierung der folgenden zu Linux sollte äußerst einfach sein. (Ich habe mich dafür entschieden, versteckte Dateien zu ignorieren und nur reguläre Dateien zu zählen ... wenn nötig ändern oder Befehlszeilenschalter hinzufügen, um die gewünschte Funktionalität zu erhalten.)
%Vor%Mein Anwendungsfall ist ein Linux SBC (Banana Pi), der Dateien in einem Verzeichnis auf einem FAT32 USB-Stick zählt. In einer Shell tun Sie
%Vor%benötigt 6.4sec mit 32k Dateien (32k = max files / dir auf FAT32) Von Python zu tun
%Vor%dauert nur 0.874 Sekunden (!) Kann nichts anderes in Python schneller als das sehen.
Tags und Links python linux ls directory-listing