2017-04-12 52 views
0

刮此代码本地工作正常,但在Heroku是由于请求超时时间超过30秒时:如何加快Rails的

if @url 
    @arr = Array.new 
    begin 
    doc = Nokogiri::HTML(open(@url)) 
    doc.css(".new-cars-results-box").each do |item| 
     hash = Hash.new 

     type = item.at_css(".new-car-name").text 
     link = "http://uae.yallamotor.com"+item.at_css(".new-car-name")[:href] 
     @arr << [link,type] 
    end 
    rescue 
    end 

end 

如何可以加快这个吗?

+0

你的代码不是最优的,但没有什么突出的,会导致它运行得更慢。我建议这个问题是你在Heroku上的环境。请阅读“[mcve]”和链接页面。您要求我们猜测您正在解析的内容,这可能会直接影响处理速度。使用光秃秃的“救援”不是一种好的做法,但它又不会影响速度。 (输出'rescue'的消息以确认没有任何异常被忽略。) –

+0

注意,Nokogiri将在任一位置运行相同的速度,但“open”可能不会。 “open”不是Nokogiri的一部分,它只是传递Nokogiri为了获取页面内容而读取的文件句柄。如果文件流需要一段时间才能打开或正在缓慢提供数据,Nokogiri将需要一段时间才能开始处理,但Nokogiri从来没有对这种延迟负责。 –

回答

0

您查询DOM 2倍任何结果框时,你可以查询一次,所有的“新的车名”,并在创建为每一个无用的散列

试试这个:

if @url 
    @arr = Array.new 
    begin 
    doc = Nokogiri::HTML(open(@url)) 
    url_prefix = 'http://uae.yallamotor.com' 
    doc.css(".new-cars-results-box > .new-car-name").each do |item| 
     type = item.text 
     link = url_prefix + item[:href] 
     @arr << [link,type] 
    end 
    rescue 
    end 
end 

还试图用它来取代这一行

doc.css(".new-cars-results-box > .new-car-name").each do |item| 

doc.css(".new-car-name").each do |item| 
+0

虽然这会清理解析一点,但它不会影响代码的运行时速度,足以修复30秒的增量。 –