- ベストアンサー
Rubyでファイルの終わりから?行目を得る方法
Rubyでファイルの再終行から?行目(コマンドのtail的な)の内容を取得しようとした場合、 どのような方法が一番メモリを消費せず、速度が速いのでしょうか? File.openしてループでgetsをしてまず全行取得、取得した内容から最終の?行を得る、のような方法は考えられるのですが、これだと一度ファイルの全てを処理するために、あまり効率が良い感じがしません。 他に何か良い方法は無いでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まさにtailを使えばよいのですが 例えば open("|tail -n 30 <xxxx.txt"){|fi| fi.gets(nil)}
その他の回答 (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秒となりました。
お礼
なるほど。openでtailする方法が良さそうですね。 なるべくならOSのコマンドを直接たたかない方法(File.open('hoge.txt','r').tail(30)みたいな)があれば良いなーと思ってたのですが、ご回答いただいた方法が良さそうですね。 どうもありがとうございます。