【发布时间】:2013-10-29 07:37:46
【问题描述】:
这是我的导入脚本。我有大约 400 000 条记录。并且在插入记录期间我的连接关闭。如何将其拆分为更小的部分?
def extract_to_database(collection)
tmp = []
type = K
inserts = []
collection.each_with_index do |line, i|
_type = line.strip
_changed = TYPES.include? _type
if _changed && i > 0
case type
when K then @k << tmp
when F then @f << tmp
when FB then @f << tmp
when I, D
pharmaceutic = Pharmaceutic.find_by pzn: tmp[PZN]
if pharmaceutic
inserts.push "(#{pharmaceutic.id}, '#{tmp[UNIT]}', '#{tmp[DOSE]}')"
end
end
tmp = []
type = _type
end
tmp << clean(line)
end
sql = "INSERT INTO pharmaceutic_dosages (`pharmaceutic_id`, `unit`, `dose`) VALUES #{inserts.join(", ")}"
CONN.execute sql
end
【问题讨论】:
-
您面临的实际问题是什么?
-
这可能是一个 X,Y 问题,您正在沿着路径 X 寻找解决方案,而实际上您正在尝试解决可能具有完全不同、更好和/或更多的 Y有效的解决方案,如果您想告诉我们更多有关数据和数据库的信息。关闭自动索引可以加速更新/插入,关闭提交并在 n 条记录之后定期提交也可以。你说你的连接正在关闭,但不要告诉我们是否产生了错误,应该有,但不要给我们实际的文本。
-
另外,在您准备好使用之前不要打开您的数据库连接。您没有显示连接的时间/地点,但打开它被认为是不好的形式,让它挂起一段不确定的时间,然后最终使用它。打开连接使用服务器上的资源,因此当您加载数据时,打开连接,立即执行您需要执行的操作,然后断开连接。
标签: mysql ruby-on-rails ruby import