У меня есть следующий код:
var1 = 0
var2 = 0
group_ids.each do |id|
result = PerformanceService.new(
group_id: id,
date_start: prev_month,
date_end: prev_month.end_of_month
).call
totals = ResultTotals.new(result, 0)
var1 += totals.var1
var2 += totals.var2
end
Метод 'call' делает запросы к базе данных, вычисления и другие вещи, чтобы получить результат производительности (который является массивом) группы.
Затем этот результат используется для получения «итогов» группы и, наконец, для получения значений «var1» и «var2». Эти значения переменных должны быть добавлены к значениям других групп для получения окончательных результатов.
Проблема заключается в том, что, когда число обрабатываемых групп очень велико, этот расчет занимает много времени. Производительность метода 'call' нельзя оптимизировать намного дальше, поэтому я хотел бы найти способ ускорить это, и я думаю, что распараллеливание l oop - хороший способ добиться этого.
Я пробовал камень 'параллельный', используя 'in_processes' и 'in_threads', но время вычисления не улучшилось.
Как я могу улучшить время вычисления этого l oop? Способ его улучшения не должен быть распараллеливающим. Я могу использовать любую альтернативу, которую вы предлагаете.
Если это поможет, я использую Ruby 2.5, Rails 5.2 и PostgreSQL 11.7 в качестве базы данных.