即使我使用线程,为什么我的导轨插入速度慢?

时间:2014-10-23 09:57:49

标签: mysql ruby-on-rails activerecord

我使用rails和Mysql作为DB。我想使用Mongo从旧系统导入大量历史数据。

我的佣金任务代码是这样的:

threads = []

File.foreach("file.json").each_slice(100) do |lines|
  threads << Thread.new {
    time = Time.now
    lines.each do |line|
      json = ... # Parse json
      Model.new(json).save!(validate: false)
    end
    p Time.now.to_f - time.to_f
  }
end

我试着用100行的json。每个线程花费10s。 但是当我尝试使用1000行的json时。每个线程花费大约90秒,所有费用大约90秒。

为什么当我用1000行导入json时,每个线程的成本仍为10?

如何加速呢?

1 个答案:

答案 0 :(得分:3)

您的瓶颈是数据库,我建议您批量创建模型。

使用active-record-import执行此操作。

示例:

models = []
File.foreach("file.json").each_slice(100) do |lines|
  lines.each do |line|
    hash = #parse line here
    models << Model.new(hash)
  end
end
Model.import models