0

文件的 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 比数据库读取更快,请告诉我!

4

1 回答 1

0

当您将 csv 加载到数据库中时,您会执行以下操作:

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

当您使用原始 csv 时,您只

  • 加载 N csv 行
  • 迭代其

当然,它更快。

于 2013-06-21T20:10:15.847 回答