2007-12-10

プローチが腐ってるのかもしれないなあ

なんかデーターが見つからない危険性を感じるというか。ファイルがでかいから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ごと減らすアプローチからと欲...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん