Вы ищете объяснение между подходом, при котором вы загружаете сразу всех пользователей:
# 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
Настраивая на использование соответствующего коэффициента группировки, вы можете балансировать между использованием памяти и производительностью.