我有两个程序 A 和 B 。我无法更改程序 A - 我只能用一些参数运行它,但我自己写了 B ,我可以按照自己喜欢的方式修改它。
程序 A 运行很长时间(20-40小时),在此期间它会生成输出到文件,以便它的大小不断增加,并且可以在运行结束时(如100-200 GB)。程序 B 然后读取文件并计算一些东西。 文件的特殊属性是它的内容不相关:我可以将文件分成两半并独立地在每个部分上运行计算,这样我就不需要一次存储所有数据:我可以在第一部分计算,然后扔掉,在第二部分计算,等等。
问题是我没有足够的空间存放这么大的文件。我想知道是否有可能以某种方式管道 A 的输出到 B ,而不会立即存储所有数据而不会产生大量文件。有可能做那样的事吗?
先谢谢你,这对我来说至关重要,罗曼。
答案 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调用来做任何事情。