【问题标题】:CSV read v/s Temp table read from database, optimization of the loop and active record usage . RubyCSV read v/s Temp table read from database, 循环优化和活动记录使用。红宝石
【发布时间】:2013-06-19 01:30:06
【问题描述】:

文件的CSV解析非常慢,所以我试图将文件直接加载到数据库中的某个临时表中,然后进行如下计算:

以前是这样的,用下面的方法花了 13 分钟添加条目:

CSV.foreach(fileName) do |line|
     completePath = line[0]                                                
    num_of_bps = line[1]

    completePath = cluster_path+ '/' + completePath
    inode = FileOrFolder.find_by_fullpath(completePath, :select=>"id") 

    metric_instance = MetricInstance.find(:first, :conditions=>["file_or_folder_id = ? AND dataset_id = ?", inode.id, dataset_id])
    add_entry(metric_instance.id, num_of_bps, num_of_bp_tests) 
end



def self.add_entry(metaid, num_of_bps, num_of_bp_tests)
    entry = Bp.new
    entry.metric_instance_id = metaid
    entry.num_of_bps = num_of_bps
    entry.num_of_bp_tests = num_of_bp_tests
    entry.save
    return entry
end

现在我把方法改成了这个,现在需要 52 分钟 :(

@bps = TempTable.all

      @bps.each do |bp|
      completePath = bp.first_column
      num_of_bps = bp.second_column
      num_of_bps3 = bp.third_column


completePath = cluster_path+ '/' + completePath
      inode = FileOrFolder.find_by_fullpath(completePath, :select=>"id")     
      num_of_bp_tests = 0
       if(inode.nil?)
       else
          if(num_of_bps !='0')
            num_of_bp_tests = 1
          end

          metric_instance = MetricInstance.find(:first, :conditions=>["file_or_folder_id = ? AND dataset_id = ?", inode.id, dataset_id])
          add_entry(metric_instance.id, num_of_bps, num_of_bp_tests)
         end
end 

如果您认为 CSV.each 比数据库读取更快,请帮我优化此代码或告诉我!

【问题讨论】:

  • 你在哪个数据库上?
  • 我认为您误解了我在另一个线程中的评论。我是说,既然数据在数据库中,忘记 ruby​​。只需使用简单的旧 INSERT+SELECT 语句构建新记录。您可以发布临时表和目标表的 DDL 吗?
  • 对不起,我没有得到你.....我正在尝试从文件 CSV.foreach 中读取条目,然后在其他一些表中检查这些条目,然后最终将条目添加到使用此方法的数据库表.....add_entry(metric_instance.id, num_of_bps, num_of_bp_tests)

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord ruby-on-rails-3.2


【解决方案1】:

当您将 csv 加载到数据库中时:

  • 加载 N 个 csv 行
  • 在数据库中插入 N 条记录
  • 选择并实例化 N 个活动记录模型
  • 遍历其

当您使用原始 csv 时,您只需要

  • 加载 N 个 csv 行
  • 遍历其

当然更快。

【讨论】:

  • 好的。有什么办法可以优化我的 CSV 读取 .... CSV.foreach(fileName) do |line| ....它很慢,我有几条记录要通过这种方式加载,将所有内容加载到数据库需要 9 小时.....所以只是想尝试数据库方式,只是希望它会更快...但后来它甚至更慢
  • 顺便说一句,如果您使用 TempTable.find_each 而不是 @bps.each - 第二个脚本会变得更快。
  • 谢谢....但是您认为 CSV 方式比这种方式快得多吗???有什么办法可以提高 CSV 的读取速度???
猜你喜欢
  • 2010-10-22
  • 1970-01-01
  • 2010-12-05
  • 2013-12-08
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
相关资源
最近更新 更多