Скажем, у меня есть файл с именем jobs.csv, и я хотел бы получить 50 тысяч лучших заданий, выполненных Foo.
Я могу сделать:
# cat jobs.csv | sort -u | head -n 50000 > /tmp/jobs.csv
# cat /tmp/jobs.csv | while read line; do Foo --job=$line; done
Или
# cat jobs.csv | sort -u | head -n 50000 | while read line; do Foo --job=$line; done
Можно ли сказать, какой из них лучше с точки зрения эффективности ввода-вывода / памяти системы?
Или даже лучше, можно ли придумать для этого лучшее решение?
Обычно я выбираю второй вариант (трубы до конца), если один из промежуточных выходов не полезен мне для другой задачи. Например, если после запуска Foo для 50 тыс. Заданий вы хотите запустить Bar для тех же заданий, было бы полезно иметь /tmp/jobs.csv
доступный.
Полное использование каналов дает системе возможность забыть о данных в кратчайшие сроки, что позволяет более эффективно использовать память. Он также обходит стеки VFS и tmpfs и поэтому использует немного меньше ЦП. Общая производительность цепочки также выше, потому что вам не нужно ждать завершения одного шага, прежде чем начинать следующий шаг (кроме случаев, когда этого требует конкретная программа).
Кстати, в вашем примере самым большим пользователем памяти будет sort
stage, потому что ему нужно сохранить все содержимое jobs.csv
в памяти, чтобы отсортировать его. Вы можете сделать его более эффективным, улучшив все, что создает jobs.csv
в первую очередь, чтобы вам больше не требовалось sort -u
.