2004年12月09日

rubyのreadlines

最近Rubyを試しに使ってるのですけども、今日はハマりにハマりました。。。なのでメモ代わりに思い出をつづっておきます(恥かくつもりで)。


文字列(String)オブジェクトのメソッドにreadlinesといって、ファイルの最後までイッキに読み込むものがあります。一行ずつgetsするより楽チンだぁ〜と思ってたのですが、どうも巨大なテキストファイル(human genome DNA sequence)を扱ってみたところ、不具合が出てしまって、ちゃんと読み込まないのです。しかもエラーを吐き出すわけでもなく、正常終了して、結果をよく見ると、切り出したセグメントが1〜2塩基ずれるという現象でした(正確に切りだせる箇所もありました)。切り出した部分のすべてが同じだけずれてるのならば、話はわかりやすかったのですが、正解・不正解がごちゃまぜで、一体どこにバグがあるのかわからず、アタマがとち狂いそうでした。でも結局のところ、すべては


readlinesの仕様


のようでして、
(注:readlinesの仕様にはありません。いい加減な記事を書いてしまいました。すみません。なお、この現象の原因を詳しく下のコメントに記述しています。 Dec 13, 2004)


readlinesは、扱うファイルのサイズがそれ程大きくないことが分かっている場合に限り使用するべきだ!


というのはもはや鉄則なんですかね!?常識??(^^; (注:メモリの消費量に注意すべきという意[なかださまよりご指摘を受けました]Dec 15, 2004)


いやー、また一つ成長してしまいました、、、途方もない時間をかけて。←ヲイ (注:いやまったく成長してませんでした!Dec 15, 2004)


関連サイト

オブジェクト指向言語Ruby
http://www.ruby-lang.org/ja/

BioRuby
http://bioruby.org/wiki/Japanese/
posted by soreyuke at 18:42| Comment(3) | TrackBack(0) | programing | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
IO#readlinesにそんな仕様はありません。そんな動作をしたならバグです。
正確なバージョンとプラットフォーム(ruby -vの結果)、
再現する(できれば最小の)コードとデータの概要(サイズ、一行の長さ、etc)を教えて下さい。
Posted by なかだ at 2004年12月11日 09:20
なかだ さま:
 お返事が遅くなってすみません。結論から言いますと、私が解析したデータファイル固有の問題かと思われます。そのファイルといいますのが、ヒト21番染色体のゲノムデータ(44626492 byte)なのですが、あるviewerから取り出したもので、全部一行つながりになっています。そして一部をMAC上のエディタで修正したものです。

ruby(ruby 1.8.0 (2003-08-04) [ia64-linux])のreadlinesでデータを取り込み、念のためDNA配列(A, G, C, T, N)以外は排除するように
---
filename = ARGV.shift
file = File.open(filename)


genome = []
data = file.readlines
genome = data.to_s.split(/[^ATGCNatgcn]/).to_s

p genome.size
---
としてサイズを測っていました。するとreadlinesとreadを使ったときではサイズが異なっていて、頭を悩ませておりました。

その後、BioRubyのサンプルスクリプトを見て
#!/usr/local/bin/ruby

require 'bio'

filename = ARGV.shift
file = File.open(filename)


input_seq = file.read
my_naseq = Bio::Sequence::NA.new(input_seq)

p my_naseq.size

としたら、私の扱ったデータもキチンと読めました。readlinesについて気になったので、googleで検索しましたところ、下記のページで

Ruby−簡単・練習問題−
http://tibet.que.ne.jp/otani/2002lecture_note/EasyExerciseForRuby.html

"場合によって、一行ずつ読み込むのではなく、全ての行をreadlines(複数形であることに注意) で一気に読み込み、その結果を一行ずつの配列にしてしまうこともできます。 これは、ファイルのサイズがそれ程大きくないことが分かっている場合に限らないと危険です。"

という記述を見つけ、上記のような記事を書きました。なかださんのご指摘を受け、再現させようと、いくつかのデータで試したのですが、私のデータ以外ではこの現象が見られないようです。私のまったくの早とちりと、誤解を招く記事内容だったこと、またお騒がせしたこと重ねてお詫びいたします。
Posted by soreyuke at 2004年12月13日 14:19
Mac上のエディタで編集した、ということであれば、改行コード絡みで何かあったのかも知れません。
その注意書きは、単に「ファイルサイズが大きいとそれに比例して大量にメモリを使用する」という意味だと思います。
Posted by なかだ at 2004年12月15日 10:30
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。