O SO armazenará em buffer a saída para uma certa quantia, mas ainda pode haver muita movimentação da cabeça se os arquivos de entrada e saída estiverem na mesma unidade, a menos que seu process.py
faça algum buffer próprio.
Você pode substituir cat
no seu exemplo por visualizador de canais (pv) (disponível na maioria dos repositórios padrão e facilmente cumprido se não estiver no repo da sua distribuição) que permite que você defina o buffer para mais (com as opções -B
/ --buffer-bytes
) e exibe uma barra de progresso (a menos que você peça que não) que poderia seja muito útil para uma operação longa se seu process.py
não exibir suas próprias informações de progresso. Para passar dados de um local em uma unidade para outro local na mesma unidade, isso pode fazer uma grande diferença, a menos que o processo geral seja principalmente vinculado à CPU, em vez de vinculado à E / S.
Então, para um buffer de 1Mb, você pode fazer:
pv -B 1m large.input.file | process.py > large.output.file
Eu uso pv
o tempo todo para esse tipo de coisa, embora principalmente para o indicador de progresso mais do que o tamanho do buffer ajustável.
Outra opção é usar o mais "padrão" (padrão em termos de estar geralmente disponível por padrão, seu formato de linha de comando é um pouco diferente dos comandos mais comuns) dd
, embora isso não tenha o recurso de barra de progresso :
dd if=large.input.file bs=1048576 | process.py > large.output.file
Editar: ps. Os pingentes podem apontar que cat
não é necessário em seu exemplo, pois o seguinte também funcionará muito bem e será um pouco mais eficiente:
process.py < large.input.file > large.output.file
Algumas pessoas referem-se à remoção de chamadas não aceitas para cat
como "demogificação", e essas pessoas provavelmente não devem ser incentivadas ...