簡體   English   中英

Rails最好的方式來添加大量的記錄

[英]Rails best way to add huge amount of records

我必須在Rails中一次向數據庫添加25000條記錄。 我也必須驗證它們。

這就是我現在擁有的:

  # controller create action
  def create
    emails = params[:emails][:list].split("\r\n")
    @created_count = 0
    @rejected_count = 0

    inserts = []
    emails.each do |email|
      @email = Email.new(:email => email)
      if @email.valid?
        @created_count += 1
        inserts.push "('#{email}', '#{Date.today}', '#{Date.today}')"
      else
        @rejected_count += 1
      end
    end
    return if emails.empty?
    sql = "INSERT INTO `emails` (`email`, `updated_at`, `created_at`) VALUES #{inserts.join(", ")}"
    Email.connection.execute(sql) unless inserts.empty?
    redirect_to new_email_path, :notice => "Successfuly created #{@created_count} emails, rejected #{@rejected_count}"
  end

它現在非常慢,沒辦法添加這么多的記錄超時原因。

有任何想法嗎? 我正在使用mysql。

我想到三件事:

  1. 您可以使用正確的工具來幫助自己: zdennis / activerecord-importjsuchal / activerecord-fast-import 問題在於,您的示例是,您還將創建25000個對象。 如果告訴activerecord-import不使用驗證,它將不會創建新對象( activerecord-import / wiki / Benchmarks
  2. 將數萬行導入關系數據庫永遠不會超快,它應該通過后台進程異步完成。 還有一些工具,如DelayedJob等: https ://www.ruby-toolbox.com/
  3. 從控制器(TM)移出屬於模型的代碼

之后,您需要重新考慮這部分應用程序的流程。 如果您在像create這樣的控制器操作中使用后台處理,則不能簡單地返回HTTP 201HTTP 200 你需要做的是返回“快速” HTTP 202 Accepted ,並提供一個鏈接到另一個表示,用戶可以檢查他們的請求的狀態(我們已經有成功響應?有多少電子郵件失敗?),因為它是現在正在后台處理。 它聽起來有點復雜,這是一個標志,你可能不應該這樣做。 為什么你必須在一個請求中添加25000條記錄? 什么是backgorund?

你為什么不為這項工作創建一個rake任務? 以下鏈接很好地解釋了它。

http://www.ultrasaurus.com/sarahblog/2009/12/creating-a-custom-rake-task/

簡而言之,一旦你編寫了rake任務,就可以通過以下方式開始工作:

rake成員:load_emails

如果您關注速度,我會從不同的角度解決問題。

  • 創建一個復制emails表結構的表; 讓它成為emails_copy 不要復制索引和約束。
  • 使用數據庫的快速導入工具將25k記錄導入其中。 請查閱您的DB文檔或查看例如MySQL的答案 您將不得不准備輸入文件,但這樣做的速度更快 - 我想您已經擁有某些文本或表格形式的數據。
  • emails_copy創建索引和約束以模仿emails表。 違規行為(如有)將浮出水面; 解決它們。
  • 驗證表中的數據。 可能需要一些原始SQL語句來檢查嚴重錯誤。 除了非常簡單的格式之外,您無需驗證電子郵件的任何內容 也許所有驗證都可以針對您將用於導入的文本進行。
  • insert into emails select * from emails_copy將電子郵件放入生產表。 那么,您可以使用它來獲得正確的自動增量ID。
  • 一旦你肯定該過程成功,請drop table emails_copy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM