Ruby on rails CSV读取v/s从数据库读取临时表,优化循环和活动记录的使用。红宝石
文件的CSV解析非常慢,因此我尝试直接将文件加载到数据库中的某个临时表中,然后按如下方式进行计算: 之前是这样的,使用以下方法添加条目需要13分钟: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.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个活动记录模型
- 迭代其
- 加载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