Ich muss eine große Datei lesen und bevor ich mit dem Lesen beginne, muss ich die Gesamtzahl der Zeilen in der Datei kennen (in Millionen).
Ich habe viele Lösungen implementiert und eine gefunden. Aber während meiner Suche habe ich darüber nachgedacht, wie es wc -l
funktioniert. Ich konnte bei Google nichts finden.
Obwohl ich eine Lösung für mein Problem gefunden habe, würde ich gerne wissen, wie es wc -l
funktioniert, da es die Anzahl der Zeilen einer Datei mit 92 Millionen Zeilen in wenigen Sekunden berechnen kann!
Wie?
Antworten:
Es liest die gesamte Datei und zählt die Anzahl der Zeilenenden. Das Zählen von Zeilenenden ist wirklich billig; Die meiste Zeit wird mit dem Lesen der Datei verbracht. Wenn sich die Datei (meistens) im Puffercache befindet, ist das auch billig. Andernfalls hängt es von der Geschwindigkeit Ihres Dateispeichers ab.
Mit anderen Worten, es gibt keine Magie.
quelle
WC liest die Datei nur in Blöcken von Rohbytes (vorzugsweise in Vielfachen der natürlichen Blockgröße des zugrunde liegenden Dateisystems, auf dem sich die Datei befindet).
Dann durchsucht es einfach den Puffer und zählt die Zeilenendezeichen. (Es werden auch Leerzeichen, Tabulatoren, Formular-Feeds und andere Sonderzeichen gezählt, nur für den Fall, dass Sie andere Informationen als die Ausgabe -l wünschen.)
Das Lesen von der Festplatte ist der kostspielige Teil in Bezug auf die Geschwindigkeit. Das Scannen des Puffers nimmt im Vergleich dazu vernachlässigbare Zeit in Anspruch.
Angenommen, Sie haben 90 Millionen Zeilen mit durchschnittlich 100 Zeichen pro Zeile.
Das sind ungefähr 9.000.000.000 Zeichen oder ungefähr 860 MB.
Ein anständiger PC mit einem SATA-3-Gbit / s-Laufwerk erledigt dies in weniger als 10 Sekunden. Selbst in einem relativ langsamen Dateisystem, in dem gleichzeitig andere Aktivitäten ausgeführt werden.
Ein schneller Computer mit einigen Leistungsoptimierungen und einem optimierten Dateisystem kann dies in weniger als 5 Sekunden tun, auch ohne auf SATA-6G und ein SSD-Laufwerk zurückgreifen zu müssen.
quelle
\n
Zeichen am Ende der Zeile ( ) - "-l, - Zeilen drucken die Zeilenumbrüche \ n \" - extrahiert auswc.c
wc -l
.. sorry ...Willkommen in der Welt der freien Software. Sie können sich immer den Quellcode ansehen
Obwohl ich zugeben muss, dass ich kein C-Programmierer bin, bin ich nicht derjenige, der den Code wirklich für Sie erklären kann (und ich wäre selbst begeistert).
Was ich weiß ist, dass da wc die Datei nicht selbst öffnet, sondern das Betriebssystem dazu auffordert, dies weitgehend vom Betriebssystem abhängt und natürlich davon, wie die Datei gespeichert wird. Abgesehen davon würde ich erwarten, dass korrekte Programmierpraktiken vorhanden sein müssen, z. B. nicht versuchen, die Datei als Ganzes auf einmal zu lesen usw.
quelle