Nun, die Aufgabe ist einfach: Ein Teil meines Skripts muss sowohl md5- als auch sha1-Hashes berechnen. Die Eingabe ist eine Datei - eine große Datei - und Hashes müssen für eine spätere Ausgabekomposition in MD- und SH-Variablen eingefügt werden.
Während die verarbeiteten Dateien wirklich groß sind (Hunderte von GB), versuche ich, Daten nach dem Lesen mehrfach zu verwenden. Ich habe etwas gefunden, das als Prozesssubstitution bezeichnet wird und das ich auf die nächste Weise übernommen habe:
$ dd if=big.tgz 2>/dev/null |tee >(sha1sum ) > >(md5sum ) ;
anstatt:
$ SH=$(sha1sum big.tgz); MD=$(md5sum big.tgz);
Aber ich fand das nächste:
Es gibt anscheinend keine Ressource und keine Zeitersparnis, da beide ungefähr benötigen. 40s (für 4,776 GB Datei)
Ich habe keine Ahnung, wie das Ergebnis des Unterprozesses
>(md5sum )
in der Variablen MD gespeichert werden soll, um es später im Skript zu verwenden
Ich habe versucht, die Pipexec zu verstehen, aber selbst die schönen Farbabbildungen waren bis jetzt kein Erfolg.
Gibt es eine andere Möglichkeit, die Ausgabe auf eine Variable umzuleiten, als VAR = $ (Befehl)?
quelle
set $(cut -d' ' -f1 <(md5sum $big) <(sha1sum $big)); md5sum=$1; sha1sum=$2
.a
,b
,c
incmd <(a) <(b) <(c)
) werden immer parallel laufen, nicht sequentiell. Außerdem verwenden moderne Systeme (viel) Caching. Wenn also zwei völlig unterschiedliche Prozesse dieselbe Datei gleichzeitig lesen und sich ihre Geschwindigkeit nicht so stark unterscheidet, werden die Daten nur einmal aus dem Sicherungsspeicher abgerufen.Antworten:
In Bezug auf die Leistung sind Sie möglicherweise durch die CPU eingeschränkt. Tatsächlich fühlen sich 4,7 TB in 40 Sekunden für MD5 und sha1sum schnell an. Also auch wenn Sie so arbeiten. Für das, was es wert ist, haben Sie reduzierte Festplatten-E / A.
Das brauchen Sie wirklich nicht
dd
. Sie können die Ausgabe von sha1sum und md5sum auch einfach zur späteren Verwendung direkt in eine Datei schreibenIch schlage vor, temporäre Dateien wie diese (
big.tgz.sha1
undbig.tgz.md5
) zu verwenden, da es bei AFAIK nicht möglich ist, zwei Variablen gleichzeitig mit unterschiedlichen Werten festzulegen. Sie können eine direkt in eine Variable erfassen, aber nicht beide. Wenn Sie beide zulassenmd5sum
und gleichzeitigsha1sum
auf dasselbe Standard schreiben, kann dies zu unvorhersehbaren Problemen führen.quelle
dd
wurde verwendet, um anzuzeigen, dass ich die Daten von einem anderen Prozess erhalten kann (Schnitzen, Komprimieren); Wenn ich es verstehe, kann ich mich auf die Pufferung des Kernels verlassen, damit die Daten nicht zweimal gelesen werden.Nun, Sie können einfach eine weitere Weiterleitung hinzufügen:
Sie können die Ausgabe auch so nehmen, wie sie ist, da es einfach ist, zwischen sha1 und md5 zu unterscheiden (unterschiedliche Länge, damit keine Verwirrung darüber besteht, welche welche ist).
Es gibt auch Dienstprogramme, die mehrere Prüfsummen selbst berechnen, ohne mit durch Reifen zu springen
tee
.Eigentlich kann das obige auch geschrieben werden ohne
tee
:Theoretisch ist dies schlecht, da Daten zweimal von der Festplatte gelesen werden.
In der Praxis sollte das parallele Ausführen beider Reader (& Hintergrund) es dem Festplatten-Cache ermöglichen, damit umzugehen, sodass Daten effektiv nur noch einmal gelesen werden. Dies setzt voraus, dass die Hash-Berechnung schnell und die E / A langsam ist, sodass kein Prozess vor dem anderen davonlaufen kann.
(Ich habe zuvor über das zweimalige Lesen in einem anderen Kontext hier geschrieben: Verwenden von pv mit md5sum - obwohl es normalerweise funktioniert, gibt es einige Risiken, daher
tee
ist es immer noch die zuverlässigere Methode.)quelle
wait
wartet auf mehrereparset
von GNU Parallel dient zum parallelen Setzen von Variablen und--tee
leitet die Eingabe an mehrere Befehle weiter:quelle