CSV读取v / s从数据库读取的临时表,循环优化和活动记录使用情况。 ruby

文件的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比数据库读取更快,请帮助我优化此代码或告诉我们!

将csv加载到数据库时,您可以:

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

当你使用原始csv时,你只是

  • 加载N csv行
  • 迭代它

当然它更快。