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が検出されるまで読むという作業をする。
- 最初は改行で止まってEOFは未検出。1ライン目を出力。
- writeバッファは4096バイト毎にフラッシュされるので4096バイトだけ書き込み。
- grepが次を読むと4096バイト+[EOF]なのでgrep側は読み込み終了して、4096バイト分のaを出力して終わる。
- 全部フラッシュされると、5000+5000+4096になる。
やっぱりwriteバッファの問題でした:-)
grepのRead自体は一度に全部読むのではなくて、1Lineずつなんだろうか。全部読んでると最初にEOFが検出されて3倍とかにならないと思うけど、1Lineずつだとすると効率悪そうだ。