Параллельно каждый l oop на Ruby на Rails 5 - PullRequest
1 голос
/ 25 марта 2020

У меня есть следующий код:

    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 в качестве базы данных.

...