Verwenden temporärer Dateien im Vergleich zu Vor- und Nachteilen von Pipes

7

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?

Tzury Bar Yochay
quelle

Antworten:

4

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.csvverfü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 sortBühne, da er den gesamten Inhalt des jobs.csvSpeichers behalten muss, um ihn zu sortieren. Sie können es effizienter machen, indem Sie alles verbessern, was zuerst erstellt wird, jobs.csvsodass Sie das nicht mehr benötigen sort -u.

Tom Shaw
quelle
"Sie können es effizienter machen, indem Sie in erster Linie das verbessern, was jobs.csv schafft, so dass Sie die Sortierung nicht mehr benötigen -u" Ich wünschte, ich hätte in irgendeiner Weise die Kontrolle über externe Datenquellen
;-)
1
Wenn Sie tatsächlich Pipes vollständig verwenden und es sich um ein Bash-Skript handelt, müssen Sie pipefailFolgendes 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
Martin M.