如何以固定速度读取线条?

Lee*_*der 6 io bandwidth limit tcp netcat

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

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

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

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

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

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

Gil*_*il' 7

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

<large_file pv -L 1k | netcat …
Run Code Online (Sandbox Code Playgroud)


小智 1

如果您使用 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
Run Code Online (Sandbox Code Playgroud)

  • 这可能会改变输入。在这种情况下,始终 1) 将 `IFS` 设置为空字符串以避免分词;2) 使用 `-r` 禁用反斜杠转义。以此作为测试字符串:“\tes\\t”。 (3认同)