用油门将文件管道输入stdin

时间:2014-05-30 16:59:20

标签: bash shell pipe stdin throttling

假设我有一个可执行文件batch_processor,它从stdin读取数据行并为每行输入执行复杂任务。如果我的数据位于名为data.txt的文件中,我可以输入以下命令来运行此作业:

bacth_processor < data.txt

或:

cat data.txt | batch_processor

在每种情况下,batch_processor都会尽可能快地使用源数据。

现在,假设我想故意限制这个过程。如果我的文件有10万行,并且我希望这项工作需要24小时来减少对系统的影响(每秒可以达到一行多一点),那么我是否可以插入管道以人为地增加延迟每行之间?

2 个答案:

答案 0 :(得分:4)

这个怎么样?

cat data.txt | while read x; do echo "$x"; sleep 0.7; done | batch_processor

或者你可以在那里使用Python / Ruby / Perl /,而不是bash循环。

答案 1 :(得分:1)

超级用户this answer使用&#34; pv&#34; (pipe viewer),它允许您限制读取文件的速率。它可以处理文件大小而不是行数,因此您需要做一些数学运算。

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