diff --git a/Gemfile b/Gemfile index 3bfe246a4..859090feb 100644 --- a/Gemfile +++ b/Gemfile @@ -109,3 +109,5 @@ gem 'request_store' # 敏感词汇 gem 'harmonious_dictionary', '~> 0.0.1' + +gem 'parallel', '~> 1.19', '>= 1.19.1' diff --git a/app/services/subjects/course_used_info_service.rb b/app/services/subjects/course_used_info_service.rb index 2561f3aa4..5ae5abe1c 100644 --- a/app/services/subjects/course_used_info_service.rb +++ b/app/services/subjects/course_used_info_service.rb @@ -21,17 +21,19 @@ class Subjects::CourseUsedInfoService < ApplicationService # choice_shixun_num: 选用该课程实训的个数(去重) # choice_shixun_frequency: 选用该课程实训的次数 course_info = [] - schools.map do |school| - name = school.name - course_count = school.course_count - student_count = school.courses.joins(:course_members).where(course_members: {role: 4, course_id: course_ids}).size - shixun_ids = school.courses.joins(homework_commons: :homework_commons_shixun) - .where(homework_commons: {id: homework_common_ids}) - .pluck("homework_commons_shixuns.shixun_id") - choice_shixun_frequency = shixun_ids.size - choice_shixun_num = shixun_ids.uniq.size - course_info << {school_id: school.id, school_name: name, course_count: course_count, student_count: student_count, - choice_shixun_num: choice_shixun_num, choice_shixun_frequency: choice_shixun_frequency} + schools.find_in_batches do |s| + Parallel.each(s) do |school| + name = school.name + course_count = school.course_count + student_count = school.courses.joins(:course_members).where(course_members: {role: 4, course_id: course_ids}).size + shixun_ids = school.courses.joins(homework_commons: :homework_commons_shixun) + .where(homework_commons: {id: homework_common_ids}) + .pluck("homework_commons_shixuns.shixun_id") + choice_shixun_frequency = shixun_ids.size + choice_shixun_num = shixun_ids.uniq.size + course_info << {school_id: school.id, school_name: name, course_count: course_count, student_count: student_count, + choice_shixun_num: choice_shixun_num, choice_shixun_frequency: choice_shixun_frequency} + end end course_info end diff --git a/app/services/subjects/user_used_info_service.rb b/app/services/subjects/user_used_info_service.rb index e4442a2f4..82fc5316b 100644 --- a/app/services/subjects/user_used_info_service.rb +++ b/app/services/subjects/user_used_info_service.rb @@ -1,6 +1,8 @@ class Subjects::UserUsedInfoService < ApplicationService + require 'parallel' attr_reader :subject, :shixun_ids + def initialize(subject) @subject = subject @shixun_ids = subject.shixuns.pluck(:id) @@ -10,18 +12,21 @@ class Subjects::UserUsedInfoService < ApplicationService def call users_info = [] users = User.includes(myshixuns: :games).where(myshixuns: {shixun_id: shixun_ids}, games: {status: 2}, users: {is_test: false}) - users.find_each do |user| - myshixuns = user.myshixuns.select{|m| shixun_ids.include?(m.shixun_id)} - name = "#{user.lastname}#{user.firstname}" - passed_myshixun_count = myshixuns.select{|m| m.status == 1}.size - passed_games_count = myshixuns.map{|m| m.games.select{|g| g.status == 2}.size }.size - code_line_count = 0 - evaluate_count = myshixuns.map{|m| m.output_times }.sum - cost_time = myshixuns.map{|m|m.total_cost_time }.sum - users_info << {user_id: user.id, name: name, passed_myshixun_count: passed_myshixun_count, - passed_games_count: passed_games_count, code_line_count: code_line_count, - evaluate_count: evaluate_count, cost_time: cost_time} + users.find_in_batches do |u| + Parallel.each(u, in_processes: 5) do |user| + myshixuns = user.myshixuns.select{|m| shixun_ids.include?(m.shixun_id)} + name = "#{user.lastname}#{user.firstname}" + passed_myshixun_count = myshixuns.select{|m| m.status == 1}.size + passed_games_count = myshixuns.map{|m| m.games.select{|g| g.status == 2}.size }.size + code_line_count = 0 + evaluate_count = myshixuns.map{|m| m.output_times }.sum + cost_time = myshixuns.map{|m|m.total_cost_time }.sum + users_info << {user_id: user.id, name: name, passed_myshixun_count: passed_myshixun_count, + passed_games_count: passed_games_count, code_line_count: code_line_count, + evaluate_count: evaluate_count, cost_time: cost_time} + end end + users_info end diff --git a/lib/tasks/statistic_subject_info.rake b/lib/tasks/statistic_subject_info.rake index 180766cd7..30516e28f 100644 --- a/lib/tasks/statistic_subject_info.rake +++ b/lib/tasks/statistic_subject_info.rake @@ -51,7 +51,7 @@ namespace :subjects do puts("---------------------course_info_statistic: #{subject.id}") Rails.logger.info("---------------------course_info_statistic: #{subject.id}") data = Subjects::CourseUsedInfoService.call(subject) - data.each do |key| + Parallel.map(data) do |key| next if key[:school_id].nil? str += ", " unless str.empty? str += ("(#{subject.id}, #{key[:school_id]}, '#{key[:school_name]}', #{key[:course_count]}, " + @@ -125,7 +125,7 @@ namespace :subjects do subjects.find_each(batch_size: 50) do |subject| puts("---------------------user_info_statistic: #{subject.id}") data = Subjects::UserUsedInfoService.call(subject) - data.each do |key| + Parallel.each(data) do |key| next if key[:user_id].nil? str += ", " unless str.empty? str += ("(#{key[:user_id]}, #{subject.id}, '#{key[:name].gsub(/'/, '"')}', #{key[:passed_myshixun_count]}, " +