Apakah ada utilitas yang bisa saya tempelkan dalam saluran pipa untuk memisahkan kecepatan baca dan tulis?
$ producer | buf | consumer
Pada dasarnya, saya ingin sebuah utilitas buf
yang membaca inputnya secepat mungkin, menyimpannya dalam memori sehingga consumer
dapat mengambil waktu yang manis sambil producer
berjalan secepat mungkin.
stdbuf
alat tampaknya menjadisize
parameter. Saya tidak yakin apakah itu berhasil.Jawaban:
The
pv
(pipa viewer) utilitas dapat melakukan hal ini (dengan-B
opsi) dan lebih banyak, termasuk memberikan laporan kemajuan.sumber
producer | tee >(pv -cB $SIZE | consumer1) | pv -cB $SIZE2 | consumer2
), ini dapat menyebabkan perlambatan lagi.pv
ratusan kali dan tidak pernah tahu ini. Sangat luar biasa, terima kasih!pv -B 4096 -c -N in /dev/zero | pv -q -B 1000000000 | pv -B 4096 -c -N out -L 100k > /dev/null
- Saya berharap keduapv
ujungnya menjadi halus (meskipun yang 1GB di depan). Tidak bekerja seperti ini, tidak seperti denganmbuffer
Anda bisa menggunakan
dd
:Ini tersedia di setiap unix.
sumber
pv
mungkin mungkin lebih baik untuk digunakan (menunjukkan kemajuan).dd
hanya menyimpan satu blok pada satu waktu, jadi itu hanya akan menunda semuanya dengan jumlah waktu yang diperlukan untuk menghasilkan ukuran blok; tolong perbaiki saya jika saya salah. Juga, dapatkah buffering ini diperluas ke ukuran tidak terbatas, atau hanya apa pun yang dimasukkan untuk ukuran blok?Lihatlah mbuffer . Ini dapat buffer ke memori atau file yang dipetakan memori (
-t
/-T
).sumber
Ini pada dasarnya adalah jawaban negatif. Tampaknya tidak ada
dd
, ataumbuffer
bahkan tidakpv
berfungsi adalah semua kasus, khususnya jika tingkat data yang dihasilkan oleh produsen dapat sangat bervariasi. Saya memberikan beberapa testcases di bawah ini. Setelah mengetik perintah, tunggu sekitar 10 detik, lalu ketik>
(untuk pergi ke akhir data, yaitu menunggu akhir input).Di sini, setelah mengetik
>
, seseorang harus menunggu selama 5 detik, artinya produser (skrip zsh) telah memblokir sebelumsleep 5
. Menambahbs
ukuran menjadi misalnya 32M tidak mengubah perilaku, meskipun buffer 32MB cukup besar. Saya menduga bahwa ini karenadd
blok pada output bukannya melanjutkan input. Menggunakanoflag=nonblock
bukanlah solusi karena ini membuang data.Dengan
mbuffer
, masalahnya adalah baris pertama (foo0) tidak segera muncul. Tampaknya tidak ada opsi untuk mengaktifkan buffer-line pada input.Dengan
pv
, perilaku tersebut mirip dengandd
. Lebih buruk lagi, saya curiga bahwa itu melakukan hal-hal yang salah ke terminal karena kadangless
- kadang tidak dapat lagi menerima input dari terminal; misalnya, seseorang tidak dapat berhenti dengannyaq
.sumber
Langkah tidak standar: menggunakan buffer soket.
Contoh:
Menerapkan dua alat tambahan untuk ini: buffered_pipeline dan mapopentounixsocket
sumber