2014-01-23 39 views
1

即時通訊解析一些RSS使用'簡單的RSS'寶石。飼料是巨大而沉重的,但我仍然想知道如果我做錯了什麼,因爲過程似乎是無止境的。簡單的RSS寶石採取年齡解析

我使用delayed_job在後臺運行進程。 Here's控制器:

class ApiController < ApplicationController 
    respond_to :html, :json 

    require 'open-uri' 

    FEED_URI = 'http://rss....' 

    def get_feed 
    Delayed::Job.enqueue FeedJob.new(FEED_URI) 
    @events = Event.all 
    end 

end 

然後來到這個類:

class FeedJob < Struct.new(:uri) 

    require 'rubygems' 
    require 'simple-rss' 
    require 'open-uri' 

    def perform 
    entryAttr = Event::TAGS + Session::TAGS + Venue::TAGS  #IM ADDING AROUND 30 TAGS 
    SimpleRSS.item_tags += entryAttr        #HERE 
    rss = SimpleRSS.parse open(uri) 
    rss.entries.each do |entry| 
     venue = Venue.find_by_map_number(entry.venueMapNumber) || Venue.new 
     save_venue(venue,entry) 
     event = Event.find_by_guid(entry.eventGuid) || Event.new 
     save_event(event,entry,venue) 
     session = Session.find_by_guid(entry.sessionGuid) || Session.new 
     save_session(session,entry,event) 
    end 
    end 
end 

任何有識之士將是有益的。

回答

0

你確定SimpleRSS是事情放緩的地方嗎?

您正在爲每個條目執行大量的數據庫讀寫操作。你有沒有試過把這些看出來,看看SimpleRSS究竟有多快?我懷疑你的數據庫是真正的瓶頸。

如果數據庫是原因,那麼有些事情可以加快速度。

首先,檢查你的日誌文件,看看哪些查詢是最慢的。修復慢的。

  • 對於讀取,您應確保它們正在打索引。對於這種查詢是高性能,您venues表應該有一個索引上map_number

    Venue.find_by_map_number(entry.venueMapNumber) 
    
  • 對於寫操作,可以分批你寫入數據,這樣你就不必爲每一個save整個交易。這必須做得很細緻,因爲你不希望你的交易太大。我通常試圖限制交易到1-3k插入/更新。最起碼,你的包裹三個交易節省:

    rss.entries.each do |entry| 
        venue = Venue.find_by_map_number(entry.venueMapNumber) || Venue.new 
        event = Event.find_by_guid(entry.eventGuid) || Event.new 
        session = Session.find_by_guid(entry.sessionGuid) || Session.new 
        ActiveRecord::Base.transaction do 
        save_venue(venue,entry) 
        save_event(event,entry,venue) 
        save_session(session,entry,event) 
        end 
    end 
    
+0

這一些好的信息卡爾,謝謝。但在這種情況下,它甚至不會進入「entries.each」循環。所以是的,我會說SimpleRSS會花費這麼長時間(我懷疑這可能是因爲它有很多custon標籤) – ntonnelier

+0

有趣。我對SimpleRSS不太熟悉。 rss有多大?大量的XML庫開始堵塞大文件,因爲它們會導致庫分配大量對象,並可能導致系統內存不足。你可能需要看看使用了一個平衡的XML解析器,比如'Nokogiri :: XML :: SAX'。它當然可以是你提到的標籤。最好的方法是使用[profiler](https://github.com/ruby-prof/ruby-prof)查看你的代碼並查看哪些方法調用花費最多時間,然後從中進行調查。 –

+0

另外,你確定解析實際上是緩慢的,或者它可能是HTTP抓取? –