Закачивание файла в 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
Другие вопросы по тегам