【问题标题】:Slow importing of CSV into Database将 CSV 导入数据库缓慢
【发布时间】:2017-08-19 12:06:52
【问题描述】:

我有一个用于更新数据的 CSV 文件。更新不超过 15.000 条记录需要很长时间(大约 10 分钟)。 这是我使用的代码:

task csv_updater_so: :environment do
    require 'csv'
    counter = 0
    time = Benchmark.realtime do
        save_folder = Rails.root.join('path_to_file')
        CSV.foreach(save_folder, encoding:'iso-8859-1:utf-8', col_sep: ';', :quote_char => "\x00", headers: true) do |row|
            #If the item is in the db I update its values
            if item = Item.find_by_internal_code(row[4]) 
                item.update(:price => row[9], :stock_b => row[10]) 
            end
            counter += 1
            print "updated items => #{counter}" + "\r"
        end
    end
end

我觉得很奇怪,从一个 xml 文件更新同一个模型只需要几秒钟。我做错了吗?

我也试过

task csv_updater_so: :environment do
    require 'csv'
    counter = 0
    time = Benchmark.realtime do
        save_folder = Rails.root.join('path_to_file')
        updateable_items = CSV.foreach(save_folder, encoding:'iso-8859-1:utf-8', col_sep: ';', :quote_char => "\x00", headers: true).map do |row|
            if item = Item.find_by_internal_code(row[4]) 
                item.update(:price => row[9], :stock_b => row[10]) 
            end
            counter += 1
            print "updated items => #{counter}" + "\r"
        end
        Item.import(updateable_items)
    end
end

【问题讨论】:

  • 您使用的是哪个版本的 Ruby 和 Rails?旧的 CSV 库确实非常慢。 (我问是因为Item.find_by_internal_code 是一种老式的查找器方法。)
  • Ruby 2.3.3 和Rails 4.2.6 比较耗时的部分似乎是更新方式,但即使我使用“touch”也没有任何改善。
  • 那么如果你删除更新行,脚本会在几秒钟内再次运行?
  • 自您上次测量 XML 变体以来,您的数据库是否已显着增长?也许缺少索引?
  • 没错,如果我删除更新行大约需要 10 秒

标签: ruby-on-rails ruby csv activerecord


【解决方案1】:

你的问题是你做的方式基本上是在每次插入时做一个事务,所以它自然会很慢。

因此,为了避免将 CSV 文件转换为 SQL COPY 命令,我的建议是使用 activerecord-import gem。 它将为您处理关联并按模型对插入进行分组。此外,由于它在单独的 gem 中提供对数据库的支持,因此您可以利用数据库的一些不错的功能,例如 PostgreSQL 中的数组。

【讨论】:

  • 我发布的第二个代码是使用那个 gem,但除非我使用错误,否则时间不会低于 10 分钟
猜你喜欢
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2017-01-11
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多