2011-10-17 356 views
0

我有一個awk腳本發出長串(> 10K字符)到標準輸出。stdbuf用法:增加緩衝區大小

我想增加緩衝區大小,以便一次寫入較大的那些長字符串塊。我計時兩個管道下面有不同的尺寸-o但沒有顯著變化

time stdbuf -o 100MB awk -f processing.awk infile.txt | sort -k1,1 > outfile.txt 
time stdbuf -o 100MB awk -f processing.awk infile.txt > outfile.txt 

真正/用戶/ SYS時機都非常相似,oneanother(+ - 10%的每個指標)。

我的問題是我是否正確使用stdbuf?謝謝。

FZ。

回答

0

stdbuf命令設法更改執行命令的標準I/O通道的緩衝區。然而,它並不(我認爲它不能)改變O/S中管道的容量。所以,我不希望看到任何性能差異。

注意,不同的是,大緩存,awk最終會在一個可怕的write()系統調用發送的所有數據(除非infile.txt,由腳本修改,本身大於100 MIB更大),而通常它會寫入0.5到8 KiB之間的緩衝區。然而,這樣一個巨大的write()的好處是最小的;它仍然需要被O/S分割以適應管道(除非O/S以不同的方式做事 - 典型地,我描述的是真實的)。

+0

謝謝。你有沒有看到任何好處,保持在管道外,並在awk中顯式轉移輸出(循環存儲的字符串和> awk內的outfile.txt)? –

+0

如果您需要對數據進行排序,您將受益於保持緩衝區大小更小,以便'sort'獲取數據,而'awk'也生成數據,因此您可以從多核在你的CPU。如果你讓'awk'在產生任何輸出前暫停,那麼就沒有並行性,整個過程將會變慢。在正常情況下,緩衝區的默認大小是可以的。我不希望看到修補緩衝區大小的二階以上性能收益。 –

+0

謝謝你。非常有益的,有用的答案。 –

1

什麼stdbuf確實被更改C STDLIB緩衝,即,stdinstdoutstderrFILE*緩衝區。

它不會更改內核中管道緩衝區的大小。這可能是你沒有看到任何改變的原因。

這是一個衆所周知的問題,管道緩衝區大小不能改變,而且很小。處理大文件時,最好將中間結果寫入文件,而不是將它們傳送到另一個應用程序中。由於管道緩衝區非常小,通過管道進行通信的應用程序之間將發生大量的上下文切換,其開銷可能會使應用程序運行時間變得更短。

+0

謝謝。我沒有意識到管道緩衝區已設置。 –