1

ステータスが「オープン」のイベントのデータベース (イベント モデル) からデータを取得し、2 つの異なるクラスのメソッドを呼び出してこれらのイベントを処理するレーキ タスクがあります。1 つ目は何らかの条件に基づいてイベントをバッチ処理し、もう 1 つのクローラーはこれらのイベント バッチの CSV を生成し、その CSV を外部 Web サイトにアップロードします。その後、クロールの実行が終了した後に、それらのバッチを参照する各イベントのステータスを更新します。

Active Record オブジェクトをこれら 2 つのクラスのメソッドに渡す方法は 2 つあります。

  1. ActiveRecord オブジェクトを 2 つのクラスに渡す (現在の実装)
  2. オブジェクトのデータベース テーブル ID を渡し、それらの各クラスからフェッチするだけです。

これらのオプションのうち、「におい」が少ないのはどれですか。私の脳は、ID が他のクラスに到達すると別のデータベース クエリを実行することで、ID を渡すとパフォーマンスが低下することを教えてくれます。一方、更新されるのはステータスだけであるため、すべてのデータを ActiveRecord オブジェクトに渡すことは不必要に思えます。では、どのオプションがより良いものでしょうか? 私が意味することを明確に理解するために、rake タスクを含めました。

  desc "Process open Events ..."
  task :process_open_events => :environment do
    open_events = Event.find_all_by_status("Open")
    event_batches = EventUtils::EventProcessor.create_event_batches(open_events)
    crawler = EventsCrawler.create!
    crawler.enqueue_crawler(event_batches)
  end
4

1 に答える 1

0

この場合、レコードのリストを読み取って(そしてメモリに保持して)、それらのIDを配列(これもメモリに保持されている)にマップし、その配列を別のメソッドに送信して、クエリを再実行するだけではありません。結果は同じですが、その初期リストの複製もメモリに入れます。

IDのリストを操作することは、処理時間、メモリ使用量、データベース使用量など、あらゆる点で効率が悪いように思われます。

于 2012-10-02T16:04:20.220 に答える