【发布时间】: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