• ベストアンサー

Rubyでファイルの終わりから?行目を得る方法

Rubyでファイルの再終行から?行目(コマンドのtail的な)の内容を取得しようとした場合、 どのような方法が一番メモリを消費せず、速度が速いのでしょうか? File.openしてループでgetsをしてまず全行取得、取得した内容から最終の?行を得る、のような方法は考えられるのですが、これだと一度ファイルの全てを処理するために、あまり効率が良い感じがしません。 他に何か良い方法は無いでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

まさにtailを使えばよいのですが 例えば open("|tail -n 30 <xxxx.txt"){|fi| fi.gets(nil)}

maenoina
質問者

お礼

なるほど。openでtailする方法が良さそうですね。 なるべくならOSのコマンドを直接たたかない方法(File.open('hoge.txt','r').tail(30)みたいな)があれば良いなーと思ってたのですが、ご回答いただいた方法が良さそうですね。 どうもありがとうございます。

その他の回答 (1)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

No.1の続きですが、 ファイル限定ですが、Rubyだけで実現するとなるとファイルのサイズを調べて、seekで最後の少し前に移動してreadなどで最後まで読み込む。 それから行を調べる方法が速そうですね。 ところで、tailなのですが、かなり速いですね。 条件の悪いネットワーク越しのファイルでやってみました(Rubyの中からではなくbashからですが) ファイルサイズは340.9MBytesのものです。 time tail <xxxx.log time tail xxxx.log ともに0.01秒程度。ということは最後の方しか読んでないようですね。 実際に全部読ませると time (cat xxxx.log|tail) で1分03秒となりました。

関連するQ&A