Один большой объект или один маленький плюс один большой информационный объект? - PullRequest
1 голос
/ 20 октября 2010

Для приложения Ruby on Rails у меня есть объект Movie, который имеет несколько атрибутов. Практически на каждой странице необходимо сравнить некоторые фильмы с полным списком фильмов, отсортированных по рейтингу, поэтому я использовал для кэширования этот большой отсортированный список. Это было полезно, потому что я мог напрямую использовать этот список фильмов и все их атрибуты без какого-либо другого запроса БД.

В последнее время список увеличился, и большой массив из 2500 фильмов просто не помещается в блок памяти Memcache размером 1 МБ.

Мне было интересно, было ли хорошей идеей разделить этот объект Movie на меньший объект (id, made_at, updated_at, Score, attribute_id) и перенести его атрибуты в другой объект. У меня был бы меньший список фильмов, отсортированных по счету, но множество других запросов.

Пока мы занимаемся этим, почему бы даже не кэшировать массив из 2500 целых чисел, выполнить математику с Ruby и получить только те 50 фильмов, которые нас интересуют? Требуется ли 50 вызовов БД, или я могу попросить PostGreSQL дать мне массив фильмов 2, 5, 6, 89,… и 2467?

Что мне делать? Какую другую часть проблемы я пропускаю?

Спасибо тебе,

Кевин

1 Ответ

1 голос
/ 20 октября 2010

Вместо удаления атрибутов из вашей модели, почему бы не загрузить только то, что вам нужно?Часто в ваших интересах использовать данные напрямую, а не привлекать модели при выполнении простых числовых сравнений.Требования к хранилищу для простого хеша значительно ниже, чем для полного экземпляра ActiveRecord.

В этом случае select_all ваш друг:

class Movie < ActiveRecord::Base
  def self.data_for(*ids)
    select_all(
      sanitize_sql([ "SELECT id, score FROM #{quote_table_name} WHERE id IN (?)", ids.flatten ])
    ).inject({ }) do |h, row|
      h[row[:id].to_i] = row
      h
    end
  end
end

Это создаст простой хеш, который выглядитчто-то вроде этого:

Movie.data_for(2, 5, 6, 89, 2467)
# => { 2 => { :id = > '2', :score => '4' }, ... }

Вы можете очистить структуру, если хотите конвертировать строки в целые числа по мере необходимости, и это еще больше уменьшит ваши требования к хранилищу.Вы можете хранить много данных с простыми числами и простыми хешами.

Сохранение этого хеша в Memcache на данный момент является простым упражнением с использованием Rails.cache

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...