usando arquivos temporários vs vantagens e desvantagens de pipes

7

Digamos que eu tenha um arquivo chamado jobs.csv e gostaria de obter os primeiros 50 mil trabalhos feitos por Foo

Eu também posso fazer:

# cat jobs.csv | sort -u | head -n 50000 > /tmp/jobs.csv
# cat /tmp/jobs.csv | while read line; do Foo --job=$line; done

Ou

# cat jobs.csv | sort -u | head -n 50000 | while read line; do Foo --job=$line; done 

Alguém pode dizer qual é o melhor em termos de eficiência IO / Memória do sistema?

Ou, melhor ainda, pode-se encontrar uma solução melhor para isso?

    
por Tzury Bar Yochay 05.06.2011 / 08:57

1 resposta

4

Eu normalmente escolho a segunda opção (canaliza todo o caminho) a menos que uma das saídas intermediárias seja útil para outra tarefa. Por exemplo, se após executar o Foo em 50k, você quiser executar o Bar nos mesmos trabalhos, seria útil ter /tmp/jobs.csv disponível.

O uso de pipes por todo o caminho dá ao sistema a capacidade de esquecer os dados o mais cedo possível, portanto, é um uso mais eficiente da memória. Ele também ignora as pilhas VFS e tmpfs e, portanto, usa menos CPU. O desempenho geral da cadeia também é mais rápido, porque você não precisa esperar que uma etapa seja concluída antes de iniciar a próxima etapa (exceto se o programa específico exigir).

A propósito, no seu exemplo, o maior usuário de memória seria o estágio sort , porque ele precisa manter todo o conteúdo de jobs.csv na memória para classificá-lo. Você pode torná-lo mais eficiente melhorando o que criar jobs.csv , para que você não precise mais de sort -u .

    
por 05.06.2011 / 09:15