Angenommen, ich habe eine Datei mit dem Namen jobs.csv und möchte die besten 50.000 Jobs von Foo erledigen lassen
Ich kann entweder:
# cat jobs.csv | sort -u | head -n 50000 > /tmp/jobs.csv
# cat /tmp/jobs.csv | while read line; do Foo --job=$line; done
Oder
# cat jobs.csv | sort -u | head -n 50000 | while read line; do Foo --job=$line; done
Kann man feststellen, welches in Bezug auf die E / A / Speicher-Effizienz des Systems besser ist?
Oder noch besser, kann man eine bessere Lösung dafür finden?
unix
shell-scripting
io
pipe
Tzury Bar Yochay
quelle
quelle
Antworten:
Normalerweise wähle ich die zweite Option (Pipes den ganzen Weg), es sei denn, einer der Zwischenausgänge ist für eine andere Aufgabe für mich nützlich. Wenn Sie beispielsweise nach dem Ausführen von Foo für 50.000 Jobs Bar für dieselben Jobs ausführen möchten, ist es hilfreich, diese
/tmp/jobs.csv
verfügbar zu haben .Durch die vollständige Verwendung von Pipes kann das System Daten zum frühestmöglichen Zeitpunkt vergessen, sodass der Speicher effizienter genutzt werden kann. Es umgeht auch die VFS- und tmpfs-Stapel und verbraucht daher geringfügig weniger CPU. Die Gesamtleistung der Kette ist ebenfalls schneller, da Sie nicht warten müssen, bis ein Schritt abgeschlossen ist, bevor Sie mit dem nächsten Schritt beginnen (es sei denn, das jeweilige Programm erfordert dies).
Übrigens wäre in Ihrem Beispiel der größte Speicherbenutzer die
sort
Bühne, da er den gesamten Inhalt desjobs.csv
Speichers behalten muss, um ihn zu sortieren. Sie können es effizienter machen, indem Sie alles verbessern, was zuerst erstellt wird,jobs.csv
sodass Sie das nicht mehr benötigensort -u
.quelle
pipefail
Folgendes festlegen : Um die Manpage zu zitieren "Wenn Pipefail aktiviert ist, ist der Rückgabestatus der Pipeline der Wert des letzten (ganz rechts) Befehls, der mit einem Wert ungleich Null beendet wird Status oder Null , wenn alle Befehle beenden erfolgreich“Ohne , dass Sie Ihren Kopf kratzen könnten , warum Ihr Script beendet mit 0 , aber immer noch falschen produziert