<a href="http://blade.nagaokaut.ac.jp/ruby/ruby-list/thr42416-42472.html#42454">ファイルを全部読み込んでから処理するか、一行ずつ読ませるか</a>
ruby-listで、最初は複数の正規表現を使って、どの表現にどのデータがマッチしたか区別しながら処理するにはどうしたら…みたいな話題が、途中から、でっかいファイルを逐行処理させる方法、という話に重点が移っていった。今まさにそういうコードを何度も何度も書いているので、かなり興味深く読んでいる。いろんなやり方があるのね。個人的には、
- 小さなファイルはIO.readlines.each
- 大きなファイルはfile=File.newしてからfile.each_line
と分けている。メモリにあまり負担をかけたくないという気持ちがあるので。なにしろたくさんの人間が同時に使っているサーバだからなあ…。とか貧乏臭いことを気にしているのです。どっちみちブロックになるから、処理の中身、書き方は一緒というか。気分が変わればイテレータを書き直すだけだし。いい加減だな俺。
ていうか、IO.foreachなんてものがあるんですか!知らなかったよ!closeをensureしてくれるとわ!いいねこれ!早速いま書いてるコードを見直そう!
ちょっと違うな
上の使い分けはちょっと良くないなあ。
- IO.readlinesは後で全体を(何か加工したにしても全体の結果を)後でまた使いたいとき
- IO.foreachは全体を使って一度だけ何かをやり、ファイルの内容自体は使い捨てにしたいとき
という風に使い分けるのかな、と、漠然と思った。