將海量平面文件讀入關係數據庫
我有一個包含約 4M 記錄的大型平面文本文件,我想使用 Ruby/Rails、Python 或任何其他方法將其讀入 MySQL。
平面文件大致是這樣的格式:business_name,address,city,state,zip,employee_name
如果企業有多名員工,則每個員工將在一行中重複企業名稱、地址等。
我想將其讀入兩個表,其中員工表具有如下外鍵:
businesses (id int, name varchar, address varchar, city varchar, etc.) employees (id int, name varchar, business_id int)
如何有效地讀取此文件,以便根據需要創建和引用員工/企業?
注意:假設文件已排序是不安全的。
我已經嘗試先將文件讀入 SQL,然後使用 SQL 獲取一個唯一的 business_name/address/city/state 組合列表,然後我可以將其插入到businesss表中,但是我的伺服器記憶體不足。這只是載入了 1/4 的記錄。
嘗試在索引很少或沒有索引的 ISAM 表中使用 LOAD DATA INFILE。ISAM 應該減少記憶體消耗並以最快的方式獲取所有數據。在使用比您的更大的數據集執行此操作時,在記憶體比現在使用的記憶體少得多的相當舊的伺服器上,我從來沒有用完記憶體。
導入數據後,使用 ALTER TABLE 添加所需的索引,本質上是唯一標識企業所需的一切(名稱、地址、狀態等)。這可能要花點時間。
創建另一個具有自動遞增主鍵的 ISAM 表以及第一個表中唯一標識企業所需的所有列(例如,那些被索引但與員工無關的列)。添加一個 UNIQUE 鍵,其中包括表中除主鍵之外的所有列。
使用 REPLACE INTO 用第一個表中的數據填充第二個表,您將在此過程中為所有業務生成唯一的數字鍵。將鍵列添加到第一個表並使用第二個表中的數據對其進行更新,然後可以將其刪除。
從那裡您應該有一個表,其中所有企業都有唯一的、數字的和索引的鍵,並且應該能夠輕鬆地將數據拆分到您需要的 (InnoDb) 表中。