Czy istnieje narzędzie, które mogę włożyć do potoku, aby oddzielić prędkości odczytu i zapisu?
$ producer | buf | consumer
Zasadniczo chcę narzędzie, buf
które odczytuje dane wejściowe tak szybko, jak to możliwe, przechowując je w pamięci, aby consumer
mogło zająć słodki czas, gdy producer
działa tak szybko, jak to możliwe.
stdbuf
Narzędziem wydaje się byćsize
parametr. Nie jestem jednak pewien, czy to działa.Odpowiedzi:
Narzędzie
pv
(przeglądarka potoków) może to zrobić (z-B
opcją) i wiele więcej, w tym przekazywanie raportów postępu.źródło
producer | tee >(pv -cB $SIZE | consumer1) | pv -cB $SIZE2 | consumer2
), może to spowodować spowolnienie.pv
setki razy i nigdy o tym nie wiedziałem. Bardzo fajnie, dziękuję!pv -B 4096 -c -N in /dev/zero | pv -q -B 1000000000 | pv -B 4096 -c -N out -L 100k > /dev/null
- Spodziewam się, że obapv
końce będą gładkie (chociaż jeden z nich ma 1 GB przewagi). To nie działa w ten sposób, w przeciwieństwie dombuffer
możesz użyć
dd
:Jest dostępny na każdym uniksie.
źródło
pv
prawdopodobnie jest prawdopodobnie łatwiejszy w użyciu (pokazuje postęp).dd
zapisuje tylko jeden blok na raz, więc opóźniałoby wszystko o czas potrzebny do wytworzenia rozmiaru bloku; Proszę popraw mnie jeżeli się mylę. Czy to buforowanie można rozszerzyć do nieograniczonego rozmiaru, czy tylko cokolwiek wprowadzonego dla rozmiaru bloku?Spójrz na mbuffer . Może buforować do pamięci lub pliku odwzorowanego w pamięci (
-t
/-T
).źródło
Jest to w zasadzie odpowiedź negatywna. Wygląda na to
dd
, że ani wszystkiembuffer
, ani nawet niepv
działają we wszystkich przypadkach, w szczególności jeśli szybkość danych generowanych przez producenta może się bardzo różnić. Poniżej podaję kilka przypadków testowych. Po wpisaniu polecenia poczekaj około 10 sekund, a następnie wpisz>
(aby przejść do końca danych, tj. Poczekać na koniec danych wejściowych).Tutaj po wpisaniu
>
trzeba poczekać 5 sekund, co oznacza, że producent (skrypt zsh) zablokował się przedsleep 5
. Zwiększeniebs
rozmiaru do np. 32M nie zmienia zachowania, chociaż bufor 32 MB jest wystarczająco duży. Podejrzewam, żedd
dzieje się tak, ponieważ blokuje wyjście, a nie kontynuuje wprowadzanie danych. Używanieoflag=nonblock
nie jest rozwiązaniem, ponieważ powoduje to odrzucenie danych.Dzięki
mbuffer
, problem jest, że pierwsza linia (foo0) nie pojawia się natychmiast. Wydaje się, że nie ma opcji włączenia buforowania linii na wejściu.Z
pv
zachowanie jest podobne dodd
. Co gorsza, podejrzewam, że źle robi to terminalowi, ponieważ czasamiless
nie może już odbierać danych wejściowych z terminalu; na przykład nie można go rzucićq
.źródło
Niestandardowy ruch: użycie buforów gniazd.
Przykład:
Zaimplementowano w tym celu dwa dodatkowe narzędzia: buffered_pipeline i mapopentounixsocket
źródło