2017-07-20 31 views
0

我有這兩個表安裝和客戶端。 安裝有大約一萬條記錄,大約有40萬客戶嘗試爲百萬條記錄生成csv時,RAM使用率爲99%Rails

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%和系統掛起,沒有進一步處理。

這裏有什麼問題,我該如何解決這個問題?

+0

您檢查了[批量](http://api.rubyonrails.org/classes/ActiveRecord/Batches.html)? – jvillian

+0

沒有嘗試過,但渴望加載工作 –

回答

2

你可以嘗試一些預先加載:

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 
+0

對不起,但你改變了我的代碼的任何部分? –

+0

另一件事,我搜索並嘗試Installation.find(:所有,:包括=>:客戶端),但它會給出錯誤 –

+0

'Installation.includes(:client).'和'if installation.client' –

相關問題