我有上千条记录我应该如何将这些数据导入到我的数据库中?
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