Existe um utilitário que eu possa usar em um pipeline para desacoplar as velocidades de leitura e gravação?
$ producer | buf | consumer
Basicamente, eu quero um utilitário buf
que leia sua entrada o mais rápido possível, armazenando-a na memória para que consumer
possa levar um bom tempo enquanto producer
executa o mais rápido possível.
stdbuf
ferramenta parece ser umsize
parâmetro. Não tenho certeza se funciona.Respostas:
O
pv
utilitário (visualizador de canal) pode fazer isso (com a-B
opção) e muito mais, inclusive fornecendo relatórios de progresso.fonte
producer | tee >(pv -cB $SIZE | consumer1) | pv -cB $SIZE2 | consumer2
), isso pode causar lentidão novamente.pv
centenas de vezes e nunca soube disso. Muito incrível, obrigado!pv -B 4096 -c -N in /dev/zero | pv -q -B 1000000000 | pv -B 4096 -c -N out -L 100k > /dev/null
- Espero que os doispv
lados sejam suaves (embora um esteja 1 GB à frente). Não funciona assim, ao contrário dembuffer
você pode usar
dd
:Está disponível em todos os unix.
fonte
pv
provavelmente seja provavelmente mais agradável de usar (mostra o progresso).dd
apenas armazena um bloco de cada vez; portanto, isso atrasaria tudo pela quantidade de tempo necessária para produzir o tamanho do bloco; Por favor me corrija se eu estiver errado. Além disso, esse buffer pode ser estendido para tamanho ilimitado ou apenas o que for inserido no tamanho do bloco?Dê uma olhada no mbuffer . Pode armazenar em buffer na memória ou no arquivo mapeado na memória (
-t
/-T
).fonte
Esta é basicamente uma resposta negativa. Parece que nem
dd
, nemmbuffer
, nempv
funciona, são todos os casos, principalmente se a taxa de dados gerados pelo produtor puder variar muito. Dou alguns casos de teste abaixo. Após digitar o comando, aguarde cerca de 10 segundos e digite>
(para ir para o final dos dados, ou seja, aguarde o final da entrada).Aqui, depois de digitar
>
, é necessário aguardar 5 segundos, o que significa que o produtor (script zsh) foi bloqueado antes dosleep 5
. Aumentar obs
tamanho para, por exemplo, 32M não altera o comportamento, embora o buffer de 32MB seja grande o suficiente. Eu suspeito que isso ocorre porquedd
bloqueia a saída em vez de continuar com a entrada. Usandooflag=nonblock
não é uma solução porque isso descarta dados.Com
mbuffer
, o problema é que a primeira linha (foo0) não aparece imediatamente. Não parece haver nenhuma opção para ativar o buffer de linha na entrada.Com
pv
, o comportamento é semelhante add
. Pior, suspeito que ele faça coisas erradas no terminal, pois às vezesless
não pode mais receber informações do terminal; por exemplo, não se pode desistirq
.fonte
Movimento fora do padrão: usando buffers de soquete.
Exemplo:
Implementou duas ferramentas adicionais para isso: buffered_pipeline e mapopentounixsocket
fonte