なんかデーターが見つからない危険性を感じるというか。ファイルがでかいからreadlinesとか使いたくないんだけれども無理かな。
class Id_sorted_data def initialize path, avarage_bytes_by_one_data, search_margin @f = File.open(path); @v = avarage_bytes_by_one_data; @cash = {}; @margin = search_margin; return self end def read number if @cash.member?(number) return @cash[number]; end @f.seek([(number - @margin) * @v, 0].max); for i in 1..20 @f.readline; temp = @f.readline; @cash[temp.to_i] = temp; if temp.to_i == number return @cash[number]; elsif (number - @margin .. number).include?(temp.to_i) return near(number); end @f.seek((number - temp.to_i - @margin) * (@v * (20 - i) / 20), IO::SEEK_CUR); end end def near number for i in 1..@margin temp = @f.readline; @cash[temp.to_i] = temp; if temp.to_i == number return @cash[number]; end end end end
どうせなら、ファイル上の位置もキャッシュしておいて、シーク位置の参考にしたら? あと、実際に動いた距離と方向の変化から、発散気味なのか、収束が遅いのか判断して、パラメー...
うお、マジレスほんとサンクス。 そうだよなあ、どうキャッシュして、どう反映させてくかだよな。まあキャッシュはまだ比較的楽だとしても、反映が難しいな…。シーク位置キャッシ...
お、いらっしゃいましたか。 このコードのコンセプトは、「馬鹿でかいファイルから幾つかの特定行を参照するにあたり、なるべくディスクIOを減らしつつメモリ消費も押える」と解釈し...
相談乗ってもらってる立場なのに気づかず時間開いてすまん。 まあファイル内容いったんメモリ上の配列にしてもいいのかもしれないけど、どうせならIOごと減らすアプローチからと欲...