2017-04-12 50 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秒的增量。 –