Извлечение всех объектов в коде заранее по соображениям производительности - PullRequest
1 голос
/ 20 мая 2010

Как вы, ребята, получаете все объекты в коде заранее?

Я полагаю, вы можете повысить производительность, если объедините все вызовы модели вместе?

Это делает дело побольше, особенно если ваша БД не может хранить все в памяти

def hitDBSeperately {

получить X пользователей ... код

получить Y пользователей ... код

получить Z пользователей ... код

}

В сравнении:

def hitDBInSingleCall {

пользователи X + Y + Z

код для X код для Y ...

}

Ответы [ 2 ]

1 голос
/ 20 мая 2010

Можете ли вы привести фрагмент кода ruby ​​on rails, наш псевдокод немного сбивает с толку?

Вы можете избежать проблемы n + 1, используя энергичную загрузку. Это можно сделать с помощью тега : includes => в вашем методе model.find.

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

1 голос
/ 20 мая 2010

Вы ищете объяснение между подходом, при котором вы загружаете сразу всех пользователей:

# Loads all users into memory simultaneously
@users = User.all

@users.each do |user|
  # ...
end

Где вы можете загрузить их по отдельности для уменьшения объема памяти?

@user_ids = User.connection.select_values("SELECT id FROM users")

@user_ids.each do |user_id|
  user = User.find(user_id)

  # ...
end

Второй подход будет медленнее, поскольку он требует N + 1 запросов для N пользователей, где первый загружает их всех одним запросом. Однако вам необходимо иметь достаточно памяти для создания экземпляров модели для каждой записи пользователя одновременно. Это не функция «памяти БД», а память приложения.

Для любого приложения с нетривиальным числом пользователей вы должны использовать подход, при котором вы загружаете пользователей по отдельности или в группах. Вы можете сделать это используя:

@user_ids.in_groups_of(10) do |user_ids|
  User.find_all_by_id(user_ids).each do |user|
    # ...
  end
end

Настраивая на использование соответствующего коэффициента группировки, вы можете балансировать между использованием памяти и производительностью.

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