如何以固定速度读取行?

如何以固定速度读取行?

我需要读取一个大型日志文件,并使用 (netbsd) netcat 在同一主机工作站上的两个虚拟机之间通过本地网络发送它。

我知道netcat有一个间隔,但据我所知,您可以使用的最小间隔是1行/秒。

我需要以这种方式发送的大多数文件都有数十万行,有些接近一百万行,因此每秒一行是不可行的。

如果我只使用 cat,我的主机/工作站最终会陷入无法使用的境地。

使用 bash 和常见的 *nix 工具,有没有一种方法可以发送文件,但以 5-10 行/秒或类似的速度将其提供给 netcat?

这样做的最终目标是让我能够对我正在考虑的集中式日志数据库进行一些概念验证测试。

答案1

pv,它可以作为NetBSD 软件包,让您可以限制管道的速率。

<large_file pv -L 1k | netcat …

答案2

事实证明,pv这是一个完美的工具(至少 pv 1.6.0)。使用-l(线模式)标志,-L限制变为线。

简单证明:

seq 0 1000|pv -l -L100 > /dev/null
1k 0:00:10 [99.6 /s] [           <=>                  

seq 0 10000|pv -l -L1k > /dev/null
10k 0:00:09 [1.03k/s] [          <=>

答案3

如果您使用 bash 和管道,并且正在寻找一种简单但肮脏的解决方案,您可以尝试使用sleep.

您可以使用它,其作用类似于cat但在每行处有一个暂停。while read i; do echo "$i"; sleep 0.01; done。这是每秒略低于 100 行的示例。

$ time (seq 1 100 | while read i; do echo "$i"; sleep 0.01; done)
[...]
real    0m1.224s
user    0m0.012s
sys     0m0.052s

答案4

或许CPU限制很有用。它限制进程可以使用的 CPU 时间百分比。大多数发行版都可以从存储库中获取它。问题是,cat 和 netcat 可能使用的 cpu 太少,无法真正有效地进行节流。

相关内容