尝试为一百万条记录生成 csv 时 RAM 使用率 99% Rails

RAM usage 99% when trying to generate csv for a million records Rails

我有这两个表安装和客户端。 安装有大约一百万条记录,大约有 40 万个客户

class Installation < ApplicationRecord
  belongs_to :client, optional: true
end

class Client < ApplicationRecord
  has_many :installations
end

我需要生成一个 csv,其中将包含数百万条安装记录,包括用户名和相关客户端的 link_to_profile(如果存在)

生成 csv 的代码是

  require 'csv'
  def self.generate_csv
    attributes = %w{ app_identifier app_name device_type  installation_id app_version time_zone created_date updated_date username link_to_profile }

      CSV.generate(headers: true) do |csv|
      csv << attributes

      Installation.all.each do |installation|
        data = [installation.app_identifier, installation.app_name , installation.device_type  , installation.db_id , installation.app_version , installation.time_zone , installation.created_date , installation.updated_date ]
        if installation.client.present?
           data << installation.client.username
           data << installation.client.link_to_profile
        end
        csv << data
      end
    end
  end

所以对于每个安装,其各自的客户端(如果存在)也被加载以获取其用户名和 link_to_profile

我有 8 GB RAM,当我调用 generate_csv 时,RAM 使用率为 20%。 它开始增加,一段时间后,就像 Lac 记录的那样,它达到 99.7% 左右,然后交换达到 50%,系统挂起,没有进一步处理。

这是什么问题,我该如何解决?

您可以尝试一些预加载:

require 'csv'
def self.generate_csv
  attributes = %w{ app_identifier app_name device_type  installation_id app_version time_zone created_date updated_date username link_to_profile }

    CSV.generate(headers: true) do |csv|
    csv << attributes

    Installation.includes(:client).each do |installation|
      data = [installation.app_identifier, installation.app_name , installation.device_type  , installation.db_id , installation.app_version , installation.time_zone , installation.created_date , installation.updated_date ]
      if installation.client
         data << installation.client.username
         data << installation.client.link_to_profile
      end
      csv << data
    end
  end
end