尝试为一百万条记录生成 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
我有这两个表安装和客户端。 安装有大约一百万条记录,大约有 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