grep分裂

http://d.hatena.ne.jp/papamitra/20061130/unix
http://d.hatena.ne.jp/sshi/20061129/p1
から
writeバッファだけの問題かなー grepはLine単位でみるからそのへんもあるんちゃうの?と思って横に長いファイルで試してみた。
結果は以下のとおり

ruby -e 'print "a"*5000' > foo
ruby -e 'puts "a"*5000' > bar
grep a foo>>foo
grep a bar>>bar
wc foo bar
    1     1 10001 foo
    3     3 14099 bar

ちなみにbarは 1行目5000文字、2行目5000文字、3行目4096文字 になりました。。。

  • grepは1ラインずつEOFが検出されるまで読むという作業をする。
  1. 最初は改行で止まってEOFは未検出。1ライン目を出力。
  2. writeバッファは4096バイト毎にフラッシュされるので4096バイトだけ書き込み。
  3. grepが次を読むと4096バイト+[EOF]なのでgrep側は読み込み終了して、4096バイト分のaを出力して終わる。
  4. 全部フラッシュされると、5000+5000+4096になる。

やっぱりwriteバッファの問題でした:-)
grepのRead自体は一度に全部読むのではなくて、1Lineずつなんだろうか。全部読んでると最初にEOFが検出されて3倍とかにならないと思うけど、1Lineずつだとすると効率悪そうだ。