使用'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
任何见解都会有用。
答案 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