simple-rss gem需要很长时间才能解析

时间:2014-01-23 05:22:48

标签: ruby-on-rails ruby parsing process rss

使用'simple-rss'gem解析一些rss。饲料大而重,但我仍然想知道我是否做错了,因为这个过程似乎无穷无尽。

我使用delayed_job在后台运行该进程。这是控制器:

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

任何见解都会有用。

1 个答案:

答案 0 :(得分: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