Вопрос: использование временных файлов и преимуществ и недостатков в трубах


Скажем, у меня есть файл с именем jobs.csv, и я хотел бы получить 50 000 рабочих мест, сделанных 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 

Можно ли сказать, какой из них лучше с точки зрения эффективности IO / памяти системы?

Или даже лучше, можно ли придумать лучшее решение для этого?


7
2018-06-05 06:57


Источник


en.wikipedia.org/wiki/Cat_(Unix)#Useless_use_of_cat


Ответы:


Обычно я использую второй вариант (трубы полностью), если один из промежуточных выходов не полезен мне для другой задачи. Например, если после запуска Foo против 50 тыс. Заданий вам понадобилось запустить Bar в отношении тех же заданий, было бы полезно иметь /tmp/jobs.csv доступный.

Использование труб полностью позволяет системе забыть о данных в кратчайшие сроки, поэтому это более эффективное использование памяти. Он также обходит стеки VFS и tmpfs и поэтому использует менее процессорный процессор. Общая производительность цепочки также выше, потому что вам не нужно ждать завершения одного шага до начала следующего шага (кроме случаев, когда это требует конкретная программа).

Кстати, в вашем примере самым большим пользователем памяти будет sort потому что он должен содержать все содержимое jobs.csv в памяти, чтобы отсортировать его. Вы можете сделать его более эффективным, улучшив все, что создает jobs.csv в первую очередь, чтобы вам больше не нужно было sort -u,


4
2018-06-05 07:15



«Вы можете сделать его более эффективным, улучшив все, что создаёт jobs.csv, в первую очередь, чтобы вам больше не нужен этот вид. - Я бы хотел, чтобы я в любом случае контролировал внешние источники данных ;-) - Tzury Bar Yochay
Если вы действительно используете трубы полностью, и это сценарий bash, обязательно установите pipefail: Чтобы процитировать manpage «Если pipefail включен, статус возврата конвейера - это значение последней (самой правой) команды для выхода с ненулевым статусом или ноль, если все команды успешно завершены». Без этого вы можете почесывать голову почему ваш скрипт выходит с 0, но все же создает фикцию - serverhorror