【问题标题】:unix pipe is streaming?Unix管道正在流式传输?
【发布时间】:2017-06-07 16:57:52
【问题描述】:

zcat big.txt.gz | split -l 1000000 - prefix

big.txt.gz 是 150 GB,假设它有大约 10 亿行。

在这种情况下,unix 管道是否将数据“流式传输”到拆分中,还是 zcat 操作完成,然后执行 split

otherpages 不清楚上述命令是否会崩溃,因为它在执行拆分之前无法将所有压缩数据保存在管道缓冲区中,或者压缩数据是否会“流式传输” " 转换成split

一般来说,unix pipe 的流式传输行为尚不清楚 - 管道何时会等到所有先前的操作完成后再将输入输入到下一个命令 stdin?

例如,如果我要链接更多的命令,它会因为内存不足而崩溃吗?例如

zcat big.txt.gz | tr 'a' 'b' | sed 's/foo/bar/g' | grep 'hello'

【问题讨论】:

  • 对于这种情况,你做对了。您应该可以轻松地输入不断增长的管道“后续”命令链。管道将阻塞生产过程,直到消耗过程信号“再给我发一些”。旧的 MS-Windows 管道没有那么灵活,(根据我的经验,很容易被太多数据淹没,因为它会像你描述的那样工作,真正一次运行 1 个进程,创建一个 tmp 文件,然后连接下一个处理到第一个 tmp 文件,并创建一个第二个 tmp 文件,等等等等)。祝你好运。

标签: unix stream pipe gzip


【解决方案1】:

管道的容量有限。 [...] 应用程序不应依赖于特定的容量:应用程序的设计应使读取进程在数据可用时立即使用数据,以便写入进程不会保持阻塞。

我不知道为什么这里有任何疑问:进程同时运行,上游进程正在写入下游进程正在读取。或者至少这是本手册页特别要求的理想状态。

现在,给定命令可能会在执行任何操作之前尝试吸收其所有输入,并且输入太大可能会导致该命令崩溃。但这与管道缓冲区溢出非常不同。

【讨论】:

  • 我不知道有任何明确的标签或定义将某些命令指定为与直接下游处理兼容,而其他命令则不兼容。例如,如何确保split 可以即时使用数据?再举一个例子,sort 肯定不会以这种方式工作,因为它需要所有数据才能对其进行排序和传递。因此,对于与“一旦可用数据立即使用”的兼容性,并没有直接明确的定义(针对每个实用程序)。
  • 这是正确的,或多或少是我想要传达的。但是您的问题的答案(“unix 管道是否将数据“流式传输”到split,或者zcat 操作是否已完成并且split 已执行”)明确地表明数据是流式传输的(或者更具体地说我应该说它可供已经在运行的消费进程使用)。消费过程对它的作用是特定于实现的,与您提出的问题并不真正相关。
猜你喜欢
  • 2018-02-21
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多