我有上千條記錄我應該如何將這些數據導入到我的數據庫中?
Code | Name | Price
00106 | Water | 9.99
00107 | Onion | 8.99
這是GES
文件編碼方式類似於下面的數據庫:
00F
意味着列標題00I
手段插入一行
有也有其他人喜歡(00D
刪除行或00U
更新)
00F
0101
02Code
031
00F
0102
02Name
031
00F
0103
02Price
030
00I
0100106
02Water
030999
00I
0100107
02Onion
030899
我想創建進口商處理這個文件,並將其推入我的數據庫。所以我開始實施:
class Importer
CONN = ActiveRecord::Base.connection
F = "00F"
I = "00I"
def extract_to_database(collection)
add = true
tmp = []
type = F
inserts = []
collection.each_with_index do |line, i|
_type = line.strip
_changed = [F,I].include? _type
if _changed && i > 0
case type
when F then @f << tmp
when I
group_id = Group.find_by(code: tmp[1]).id
inserts.push "(group_id,'#{tmp[2]}','#{tmp[3]}')"
end
tmp = []
type = _type
end
tmp << line
end
sql = "INSERT INTO products (`group_id`, `name`, `price`) VALUES #{inserts.join(", ")}"
CONN.execute sql
end
end
有一個問題,我想重構,使用函數式編程。
而且我將不得不通過code
找到其他型號,並將其與products
表相關聯some_model_id
列,因此這可能會使整個過程變得複雜。因爲現在導入這些數據需要幾個小時。
也許使用Ruby不是最好的選擇。
你有沒有看看過程中最慢的部分。也許批量插入sql並將文件拆分爲多個較小的版本並且並行運行它們可以提供幫助嗎? – HariKrishnan
最慢的是每次查找group_id。我想同時做到這一點,但也許你可以告訴我該怎麼分開。通過複製粘貼手動剪切文件? – tomekfranek
如果group_id查找所花費的時間最多,也許可以將組標識轉儲到鍵值存儲,如redis,從而實現O(1)查找。這可能會讓事情變得更快。而不是在同一個循環中插入,也許你可以將輸入分成相同大小的文件並通過解析器運行它們,該解析器爲每條記錄分配sql插入。然後你可以批量運行插入語句。是否還有更新或刪除操作? – HariKrishnan