Закачивание файла в stdin с дросселем
Предположим, у меня есть исполняемый файл, batch_processor
, который читает строки данных из стандартного ввода и выполняет сложную задачу для каждой строки ввода. Если мои данные были в файле с именем data.txt
Я мог запустить эту работу, набрав:
bacth_processor < data.txt
или же:
cat data.txt | batch_processor
В каждом случае, batch_processor
потребляет исходные данные так быстро, как может.
Теперь предположим, что я хочу намеренно ограничить этот процесс. Если мой файл содержит 100000 строк, и я хочу, чтобы работа заняла 24 часа, чтобы уменьшить влияние на систему (что составляет чуть более одной строки в секунду), можно ли что-то добавить в конвейер, чтобы искусственно добавить задержку между каждой строкой?
2 ответа
Как насчет этого?
cat data.txt | while read x; do echo "$x"; sleep 0.7; done | batch_processor
или вы можете использовать Python/Ruby/Perl/ что угодно там вместо цикла bash.
У суперпользователя есть этот ответ, чтобы использовать "pv" ( просмотрщик каналов), который позволяет вам ограничить скорость чтения файла. Он работает с размером файла, а не с количеством строк, поэтому вам нужно будет немного подсчитать.
pv -L 10 data.txt | batch_processor
pv будет загружать файл со скоростью 10 байт в секунду. По умолчанию pv используется для отображения индикатора выполнения. Это может быть или не быть желательным и может быть отключено с помощью флага -q.
Если вы не хотите заниматься математикой, я думаю, вы могли бы сделать что-то вроде этого.
stat -c "%s" data.txt | xargs -IB expr B / \( 24 \* 60 \* 60 \) | xargs -IX pv -qL X data.txt | batch_processor