Gibt es ein Dienstprogramm, das ich in eine Pipeline stecken kann, um Lese- und Schreibgeschwindigkeiten zu entkoppeln?
$ producer | buf | consumer
Grundsätzlich möchte ich ein Dienstprogramm buf
, das seine Eingabe so schnell wie möglich liest und sie im Speicher speichert, damit es consumer
seine schöne Zeit in Anspruch nimmt, während es producer
so schnell wie möglich ausgeführt wird.
stdbuf
Werkzeug scheint einsize
Parameter zu sein. Ich bin mir nicht sicher, ob es funktioniert.Antworten:
Das
pv
Dienstprogramm (Pipe Viewer) kann dies (mit der-B
Option) und vieles mehr tun , einschließlich der Erstellung von Fortschrittsberichten.quelle
producer | tee >(pv -cB $SIZE | consumer1) | pv -cB $SIZE2 | consumer2
) befinden, kann dies erneut zu einer Verlangsamung führen.pv
hunderte Male benutzt und wusste es nie. Sehr genial, danke!pv -B 4096 -c -N in /dev/zero | pv -q -B 1000000000 | pv -B 4096 -c -N out -L 100k > /dev/null
- Ich erwarte, dass beidepv
Enden glatt sind (obwohl eine 1 GB voraus ist). Anders als beimbuffer
Sie können verwenden
dd
:Es ist auf jedem Unix verfügbar.
quelle
pv
die Verwendung wahrscheinlich besser ist (zeigt den Fortschritt an).dd
nur ein Block gleichzeitig gespeichert. Es würde also alles nur um die Zeit verzögern, die erforderlich ist, um die Blockgröße zu erzeugen. Bitte korrigieren Sie mich, wenn ich falsch liege. Kann diese Pufferung auch auf eine unbegrenzte Größe erweitert werden oder nur, was auch immer für die Blockgröße eingegeben wurde?Schauen Sie sich mbuffer an . Es kann in den Speicher oder in eine Speicherzuordnungsdatei (
-t
/-T
) puffern .quelle
Dies ist im Grunde eine negative Antwort. Es scheint, dass weder
dd
nochmbuffer
noch gar nichtspv
funktioniert, insbesondere wenn die vom Hersteller generierte Datenrate sehr unterschiedlich sein kann. Ich gebe einige Testfälle unten. Warten Sie nach der Eingabe des Befehls etwa 10 Sekunden und geben Sie dann Folgendes ein>
(um zum Ende der Daten zu gelangen, dh bis zum Ende der Eingabe zu warten).Hier muss man nach dem Tippen
>
5 Sekunden warten, was bedeutet, dass der Produzent (zsh script) vor dem blockiert hatsleep 5
. Das Erhöhen derbs
Größe auf z. B. 32 MB ändert nichts am Verhalten, obwohl der 32-MB-Puffer groß genug ist. Ich vermute, das liegt daran, dass diedd
Ausgabe blockiert wird, anstatt mit der Eingabe fortzufahren. Verwendenoflag=nonblock
ist keine Lösung, da hierdurch Daten verworfen werden.Mit
mbuffer
ist das Problem , dass die erste Zeile (foo0) nicht sofort angezeigt. Es scheint keine Option zu geben, um die Zeilenpufferung bei der Eingabe zu aktivieren.Mit
pv
ist das Verhalten ähnlichdd
. Schlimmer noch, ich vermute, dass es falsche Dinge mit dem Terminal tut, da manchmalless
keine Eingaben mehr vom Terminal empfangen werden können. zum Beispiel kann man es nicht mit beendenq
.quelle
Nicht-Standard-Verschiebung: Verwenden von Socket-Puffern.
Beispiel:
Dazu wurden zwei zusätzliche Tools implementiert: buffered_pipeline und mapopentounixsocket
quelle