Schnellste Möglichkeit zum drucken einer einzelnen Zeile in einer Datei
Ich haben zu Holen eine bestimmte Zeile aus einer großen Datei (1500000 Linien), mehrfach in einer Schleife über mehrere Dateien, fragte ich, mein selbst, was wäre die beste option (in Sachen Leistung).
Es gibt viele Möglichkeiten, dies zu tun, ich manly verwenden Sie diese 2
cat ${file} | head -1
oder
cat ${file} | sed -n '1p'
Konnte ich nicht finden, eine Antwort auf dieses tun Sie beide, nur Holen sich die erste Zeile oder einer der beiden (oder beide) öffnen Sie zuerst die gesamte Datei und Hole dann die Zeile 1?
Verwenden
Warum Rohr
time
zur Messung der Befehle.Warum Rohr
cat
in die tools? Sie können beide Dateien öffnen sich, und wenn Sie sind besorgt über Energieeffizienz, Sie können wahrscheinlich tun Sie es besser. Aber, ja, das Rohr sollte "stream" nur die ersten paar Blöcke der Datei (und dann feststellen, dass der Verbraucher hielt die Sorge).InformationsquelleAutor JBoy | 2013-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Drop die nutzlose Verwendung von
cat
und tun:Diese wird beendet, die
sed
script nach der Zeile gedruckt worden ist.Benchmarking-Skript:
Speichern Sie einfach als
benchmark.sh
und führenbash benchmark.sh
.Ergebnisse:
**Die Ergebnisse aus der Datei mit 1.000.000 Zeilen.* * *
Also die Zeiten für
sed -n 1p
wächst Linear mit der Länge der Datei, aber das timing für die anderen Varianten wird konstant (und vernachlässigbar), wie Sie beenden Sie alle nach dem Lesen der ersten Zeile:Hinweis: timings sind vom original abweichen post wegen wird auf eine schnellere Linux-box.
sed 1q file
die ein wenig weniger beschäftigt.Ich habe dieses format, so kann ich verwendet werden, zum drucken einer einzelnen Zeile in der Datei.
Idealerweise sollten Sie erstellen Sie die Datei jedes mal. Je nach Dateisystem, caching beeinflussen können, timings, so dass der erste Lauf ist der Reale I/O und weiteren Durchläufen profitieren.
+1 für die detaillierte performance-Vergleich. btw, in Ihrem Skript, das sed-Linie (
sed 1q
) incase
undheading
unterschiedlich sind. 🙂 es wäre gut, um Ihnen zu gleichen, besonders für performance-Tests. trotzdem, nette Antwort!guter Platz, rutschte durch, wie ich war, die Prüfung und Aktualisierung. Auch Hinzugefügt eine schöne Grafik!
InformationsquelleAutor
Wie über die Vermeidung von Rohren?
Beide
sed
undhead
Unterstützung der Dateinamen als argument. Auf diese Weise vermeiden Sie die übergabe von cat. Ich habe es nicht Messen, aber der Kopf sollte schneller auf größere Dateien, wie es Stoppt die Berechnung nach N Zeilen (in der Erwägung, dass sed geht durch alle von Ihnen, auch wenn es nicht drucken - es sei denn, Sie geben denq
uit option wie oben vorgeschlagen).Beispiele:
Wieder, ich habe nicht testen Sie die Effizienz.
InformationsquelleAutor Elisiano Petrini
Wenn du wirklich nur immer die erste Zeile und Lesen Hunderte von Dateien, dann erwägen, shell gelieferten statt externe externe Befehle verwenden
read
was ist ein shell-builtin von bash und ksh. Dadurch entfällt der overhead für die Prozess-Erstellung mitawk
,sed
,head
usw.Dem anderen Problem zu tun timed performance-Analyse auf der I/O. Das erste mal, wenn Sie öffnen und dann eine Datei Lesen, Datei ist wahrscheinlich nicht im Arbeitsspeicher zwischengespeichert. Jedoch, wenn Sie versuchen, eine zweite Befehl auf die gleiche Datei wieder die Daten, als auch die inode zeigt, die zwischengespeichert wurden, so die zeitgesteuerte Ergebnisse sind möglicherweise schneller, so ziemlich unabhängig von dem Befehl, den Sie verwenden. Plus, inodes bleiben können zwischengespeichert praktisch immer. Auf Solaris beispielsweise. Oder jedenfalls mehrere Tage.
Zum Beispiel, linux-caches alles und die Küchenspüle, die eine gute performance-Attribut. Aber es macht benchmarking problematisch, wenn Sie nicht bewusst sind das Problem.
Alle diese caching-Effekt "Störungen" ist beides, Betriebssystem und hardware abhängig.
So wählen Sie eine Datei, Lesen Sie es mit einem Kommando. Jetzt ist es zwischengespeichert. Führen Sie den gleichen test-Befehl mehrere Dutzend mal, das ist sampling die Wirkung des Befehls und der Kind-Prozess geschaffen haben, nicht Ihren I/O-hardware.
dies ist sed vs Lesen für 10 Iterationen immer die erste Zeile in der gleichen Datei, nach Lesen Sie die Datei einmal:
sed:
sed '1{p;q}' uopgenl20121216.lis
Lesen:
read foo < uopgenl20121216.lis ; export foo; echo "$foo"
Dies ist eindeutig künstlich, sondern zeigt den Unterschied zwischen builtin performance vs mit einem Befehl.
read
sicher genug, es war der Schnellste (nicht einmal registrieren neben der gelegentlichen 0.001).InformationsquelleAutor jim mcnamara
Wenn Sie drucken wollen nur 1 Zeile (sagen die 20) aus einer großen Datei würde es auch tun:
Habe ich einen "basic" - test mit bash und es scheint besser als die
sed -n '1{p;q}
Lösung vor.Test dauert eine große Datei und druckt eine Zeile irgendwo in der Mitte (an der Linie
10000000
), wiederholt sich 100 mal, jedes mal, wenn die Auswahl der nächsten Zeile. So selektiert er Zeile10000000,10000001,10000002, ...
und so weiter, bis10000099
vs.
Für das drucken einer Zeile aus mehreren Dateien
InformationsquelleAutor dvvrt