【问题标题】:Piping a file into stdin with throttle使用油门将文件导入标准输入
【发布时间】:2014-05-30 16:59:20
【问题描述】:

假设我有一个可执行文件batch_processor,它从标准输入读取数据行并为每一行输入执行一个复杂的任务。如果我的数据在一个名为 data.txt 的文件中,我可以通过键入以下内容来运行此作业:

bacth_processor < data.txt

或:

cat data.txt | batch_processor

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

现在,假设我想有意限制这个过程。如果我的文件有 100,000 行,并且我希望这项工作需要 24 小时来减少对系统的影响(每秒超过 1 行),是否可以在管道中插入一些东西来人为地增加延迟每行之间?

【问题讨论】:

  • 您的目标是“减少对系统的影响”,还是让工作耗时 24 小时?第一个可以通过简单地以低优先级运行来实现,这意味着只要没有更高优先级的东西想要运行,它就会尽可能快地运行,但如果系统是大多是闲置的。秒可以通过在每条线之间插入延迟来近似,但是如果每条线的时间要求差异很大,则只能近似结果...
  • @twalberg 我会说更多“让工作需要 24 小时”。想象一下batch_processor 向 Twitter API 发出一堆请求。你不会希望每 y 分钟点击它超过 x 次,否则你会因为超过他们的速率限制而被判入狱。

标签: bash shell pipe stdin throttling


【解决方案1】:

这个怎么样?

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

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

【讨论】:

  • 请注意,这很可能会遇到管道缓冲问题......它可能会起作用,但比预期的更“突发”。但是,如果不编写一些自定义代码,它可能是使用标准 shell 功能可以获得的最佳近似值......
【解决方案2】:

超级用户有this answer 可以使用“pv” (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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2012-11-05
    • 2020-02-13
    • 2012-06-04
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多