【发布时间】: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 文件,等等等等)。祝你好运。