Existe-t-il un utilitaire que je peux coller dans un pipeline pour découpler les vitesses de lecture et d'écriture?
$ producer | buf | consumer
Fondamentalement, je veux un utilitaire buf
qui lit son entrée le plus rapidement possible, le stockant en mémoire afin de consumer
prendre son temps tout en producer
s'exécutant le plus rapidement possible.
stdbuf
outil semble être unsize
paramètre. Je ne sais pas si cela fonctionne bien.Réponses:
L'
pv
utilitaire (visualiseur de tuyaux) peut le faire (avec l'-B
option) et bien plus encore, notamment en vous fournissant des rapports d'avancement.la source
producer | tee >(pv -cB $SIZE | consumer1) | pv -cB $SIZE2 | consumer2
), cela peut entraîner à nouveau des ralentissements.pv
centaines de fois et je ne l'ai jamais su. Très génial, merci!pv -B 4096 -c -N in /dev/zero | pv -q -B 1000000000 | pv -B 4096 -c -N out -L 100k > /dev/null
- Je m'attends à ce que les deuxpv
extrémités soient lisses (bien que l'une ait 1 Go d'avance). Cela ne fonctionne pas de cette façon, contrairement àmbuffer
vous pouvez utiliser
dd
:Il est disponible sur tous les Unix.
la source
pv
soit probablement plus agréable à utiliser (indique la progression).dd
ne stocke qu'un bloc à la fois, il retarderait donc tout le temps de production de la taille du bloc; Corrigez-moi si j'ai tort, s'il-vous plait. En outre, cette mise en mémoire tampon peut-elle être étendue à une taille illimitée, ou uniquement ce qui est entré pour la taille du bloc?Jetez un oeil à mbuffer . Il peut mettre en mémoire tampon ou un fichier mappé en mémoire (
-t
/-T
).la source
Il s'agit essentiellement d'une réponse négative. Il apparaît que ni
dd
, nimbuffer
, ni même nepv
fonctionnent tous les cas, en particulier si le taux de données générées par le producteur peut varier considérablement. Je donne quelques tests ci-dessous. Après avoir tapé la commande, attendez environ 10 secondes, puis tapez>
(pour aller à la fin des données, c'est-à-dire attendre la fin de l'entrée).Ici, après avoir tapé
>
, il faut attendre 5 secondes, ce qui signifie que le producteur (script zsh) s'est bloqué avant lesleep 5
. L'augmentation de labs
taille, par exemple à 32 Mo, ne change pas le comportement, bien que le tampon de 32 Mo soit suffisamment grand. Je soupçonne que c'est parce que lesdd
blocs sur la sortie au lieu de continuer avec l'entrée. L'utilisationoflag=nonblock
n'est pas une solution car cela supprime les données.Avec
mbuffer
, le problème est que la première ligne (foo0) n'apparaît pas immédiatement. Il ne semble pas y avoir d'option pour activer la mise en mémoire tampon de ligne en entrée.Avec
pv
, le comportement est similaire àdd
. Pire encore, je soupçonne que cela fait du tort au terminal car parfoisless
il ne peut plus recevoir d'entrée du terminal; par exemple, on ne peut pas le quitter avecq
.la source
Déplacement non standard: en utilisant des tampons de socket.
Exemple:
Implémentation de deux outils supplémentaires pour cela: buffered_pipeline et mapopentounixsocket
la source