2011-02-17 114 views
2

我有兩個程序AB。我不能更改程序A - 我只能用一些參數運行它,但我自己寫了B,我可以按照我喜歡的方式修改它。Linux中的文件輸出重定向

方案運行很長一段時間(20-40小時),在此期間它輸出產生到文件,使得其尺寸增大不斷並且可以是在運行的端部巨大(例如100 -200 GB)。程序B然後讀取文件並計算一些東西。 文件的特殊屬性是它的內容不相關:我可以將文件分成兩半,並獨立運行每個部分的計算,以便我不需要一次存儲所有數據:我可以計算出第一部分,然後扔掉,計算第二個等。

問題是,我沒有足夠的空間來存儲這樣的大文件。我想知道是否有可能以某種方式管道輸出AB沒有一次存儲所有的數據,沒有製作大量的文件。有沒有可能做這樣的事情?

先謝謝你,這對我來說至關重要,羅馬。

回答

3

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

A | B 

否則,使用fifo。

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

編輯:調整緩衝區大小用ulimit -p然後:

cat /tmp/fifo | B 
+0

據我所知,我需要同步** B **的輸出與** A **閱讀。但問題是,我無法控制** B **的執行速度,** A **有時可能會分析輸出速度慢於產生的速度。我該如何解決這個問題? – grzkv 2011-02-17 14:07:09

1

可以將一個程序的輸出流水線化爲另一個。

閱讀here瞭解Unix流水線的語法和知識。

1

可以使用socat可以採取stdout和餵它網絡,並從網絡上獲取,並餵它標準輸入

命名或未命名的管道有一個小(4k?)緩衝區的問題..這意味着如果您正在編寫多GB的過程上下文切換太多...

或if你足夠冒險..你可以LD_PRELOAD一個如此在進程A,並捕獲打開/寫入調用做任何事情..