Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails CSV读取v/s从数据库读取临时表,优化循环和活动记录的使用。红宝石_Ruby On Rails_Ruby_Ruby On Rails 3_Activerecord_Ruby On Rails 3.2 - Fatal编程技术网

Ruby on rails CSV读取v/s从数据库读取临时表,优化循环和活动记录的使用。红宝石

Ruby on rails CSV读取v/s从数据库读取临时表,优化循环和活动记录的使用。红宝石,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,Ruby On Rails 3.2,文件的CSV解析非常慢,因此我尝试直接将文件加载到数据库中的某个临时表中,然后按如下方式进行计算: 之前是这样的,使用以下方法添加条目需要13分钟: CSV.foreach(fileName) do |line| completePath = line[0] num_of_bps = line[1] completePath = cluster_path+ '/' + co

文件的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分钟:(


请帮助我优化此代码,或者让我知道您是否认为CSV.each比数据库读取速度快!

当您将CSV加载到数据库时,您会:

  • 加载N个csv行
  • 插入N条记录int DB
  • 选择并实例化N个活动记录模型
  • 迭代其
当您使用原始csv时,您只需要

  • 加载N个csv行
  • 迭代其

当然更快。

你在哪个数据库上?我想你误解了我在另一个线程中的评论。我是说,既然数据在数据库中,就忘了ruby。只需用一个普通的
INSERT
+
SELECT
语句构建新记录。你能发布temp和target表的DDL吗?很抱歉,我无能为力我正在尝试从CSV.foreach文件中读取条目,然后检查其他一些表中的条目,然后使用此方法将条目最终添加到数据库表中……添加条目(metric_instance.id,num_of_bps,num_of_bp_tests)好的。是否有任何方法可以优化我的CSV read…CSV.foreach(文件名)do | line |..速度很慢,我用这种方式加载了好几条记录,将所有东西加载到数据库需要9个小时..所以我只是想尝试一下数据库方式,只是希望它会更快…但是如果你使用
诱惑的话,它甚至更慢。找到每个
而不是
@bps。每个
-第二个脚本i’我会变得更快。谢谢……但你们认为CSV方式比这种方式快得多吗???我有什么办法可以提高CSV的阅读能力吗???
@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