Linux中的文件输出重定向

时间:2011-02-17 10:38:12

标签: linux file-io filesystems

我有两个程序 A B 。我无法更改程序 A - 我只能用一些参数运行它,但我自己写了 B ,我可以按照自己喜欢的方式修改它。

程序 A 运行很长时间(20-40小时),在此期间它会生成输出到文件,以便它的大小不断增加,并且可以在运行结束时(如100-200 GB)。程序 B 然后读取文件并计算一些东西。 文件的特殊属性是它的内容不相关:我可以将文件分成两半并独立地在每个部分上运行计算,这样我就不需要一次存储所有数据:我可以在第一部分计算,然后扔掉,在第二部分计算,等等。

问题是我没有足够的空间存放这么大的文件。我想知道是否有可能以某种方式管道 A 的输出到 B ,而不会立即存储所有数据而不会产生大量文件。有可能做那样的事吗?

先谢谢你,这对我来说至关重要,罗曼。

3 个答案:

答案 0 :(得分:3)

如果程序A支持它,只需管道。

A | B

否则,请使用fifo。

mkfifo /tmp/fifo
ls -la > /tmp/fifo &
cat /tmp/fifo

编辑:使用ulimit -p调整缓冲区大小,然后:

cat /tmp/fifo | B

答案 1 :(得分:1)

可以将一个程序的输出转换为另一个程序。

阅读here以了解Unix流水线的语法和知识。

答案 2 :(得分:1)

你可以使用socat来获取stdout并将其提供给网络并从网络获取并将其提供给stdin

命名或未命名的管道有一个小(4k?)缓冲区的问题..这意味着如果你正在编写多个gb,有太多的进程上下文切换......

或者如果你有足够的冒险精神......你可以在进程A中LD_PRELOAD一个,然后捕获open / write调用来做任何事情。