2012-02-13 48 views
2

我有一個rails應用程序,其中包含大約3000萬行的表格,這些表格由我的數據提供程序每季度向我提供的文本文檔構建。從那裏我做一些操作和比較其他一些表,並創建一個更多的自定義數據的表。更新Rails應用程序中的大量數據

我第一次做這件事時,我通過Rails控制檯運行了一個ruby腳本。這很慢,顯然不是最好的方法。

什麼是簡化此過程並在沒有任何或至少非常有限的停機時間的情況下在生產服務器上對其進行更新的最佳方法?

這是我想這個過程是最適合現在:

  1. 在數據讀取創建rake任務。使用activerecord-import插件進行批量寫入並關閉主動記錄驗證。將這些數據加載到全新的重複表格中。

  2. 在新創建的表上構建索引。

  3. 將新創建的表格重命名爲rails應用程序正在查找的名稱。

  4. 刪除舊的。

我打算在生產服務器上做的所有這些。

有沒有更好的方法來做到這一點?

從評論其他注意事項:

  • 表已經存在
  • 舊錶和數據都是一次性
  • 表可以被鎖定只能選擇
  • 必須最大限度地減少停機時間
  • 我們目前服務器狀況是2個高CPU Amazon EC2實例。我相信他們有1.7GB的RAM,所以臨時存儲整個導入可能不是一個選項。
  • 新數據是原始文本文件,行分隔。我有解析已經用Ruby編寫的腳本。
+0

使用resque或delayed-job運行導入作爲後臺任務可能會起作用,您是否急於讓它們進入或者不希望服務器在運行時放慢速度。 – nodrog 2012-02-13 18:18:49

+0

有點匆忙。我更關心的是爲此提供最無痛和自動化的流程,因爲我必須從現在開始每3個月完成一次,直到永遠。 – Patm 2012-02-13 18:26:17

+0

可能的路線取決於您的確切要求。 您需要的表格是否已經存在?結構是否改變?你需要表中的舊數據嗎?新的數據是否完全取代了表格的舊內容?你能獨佔鎖定表嗎?你需要儘量減少停機時間?你有足夠的內存可用來暫時保存整個導入的數據嗎? – 2012-02-13 18:42:17

回答

1

1)創建「my_table_new」爲「MY_TABLE」 2)導入的文件(在X線批次)的空克隆到my_new_table - 建成爲你去索引。 3)運行:RENAME TABLE my_table to my_table_old,my_table_new TO my_table;

將其作爲一個命令使其即時(足夠近),幾乎沒有停機時間。我已經用大數據集完成了這項工作,並且因爲它的重命名是'switch',所以您應該保留正常運行時間。

+0

如果你有任何表格/行鎖goig會失敗,我們關掉了所有的工作人員,當它跑了,然後踢他們回來。如果服務器正在鎖定,那麼只需找到一個不忙的時間並執行直到它通過 – TomDunning 2012-02-14 09:08:10

1

根據你的邏輯,我會認真考慮使用SQL處理數據庫中的數據。這與數據非常接近,30米行通常不是您想要從數據庫中提取出來的數據,並且與您從數據庫中取出的其他數據進行比較。

所以在Ruby on Rails框之外思考。

SQL具有內置的連接數據和比較數據以及插入和更新表的能力,這些功能可以非常強大和快速,允許數據在數據附近進行處理。