2

レコードのバッチを制限して並べ替える必要があり、find_each を使用しています。多くの人がこれを求めているのを見てきましたが、本当に良い解決策はありません. 見逃してたらリンク貼ってください!

30M のレコードがあり、重み列の値が最も高い 10M を処理したいと考えています。

私は誰かが書いたこのメソッドを使用しようとしました: find_each_with_orderしかし、それを動作させることはできません。

そのサイトのコードは、オプションとして注文を受けません。名前が find_each_with_order であることを考えると、奇妙に思えます。次のように追加しました。

class ActiveRecord::Base
# normal find_each does not use given order but uses id asc
def self.find_each_with_order(options={})
  raise "offset is not yet supported" if options[:offset]
  page = 1
  limit = options[:limit] || 1000
  order = options[:order] || 'id asc'      
  loop do
    offset = (page-1) * limit
    batch = find(:all, options.merge(:limit=>limit, :offset=>offset, :order=>order))
    page += 1
    batch.each{|x| yield x }
    break if batch.size < limit
  end
end

そして、私は次のようにそれを使用しようとしています:

class GetStuff
  def self.grab_em
    file = File.open("1000 things.txt", "w")
    rels = Thing.find_each_with_order({:limit=>100, :order=>"weight desc"})
    binding.pry
    things.each do |t|
      binding.pry
      file.write("#{t.name} #{t.id} #{t.weight}\n" )
      if t.id % 20 == 0
        puts t.id.to_s
      end
    end
    file.close
  end
end

ところで、postgres にデータがあり、サブセットを取得してそれを neo4j に移動するつもりなので、neo4j の人がこれを行う方法を知っている場合に備えて、neo4j でタグ付けしています。ありがとう。

4

1 に答える 1