2009-08-07 31 views
0

我想渲染一个大的(ish)对象数组作为Ruby on Rails中的plist。该集合目前最多包含200个对象,每个对象本质上都是一个记录(键/值字典)。整体结果格式为plist(Apple使用),但逻辑上与任何XML文档没有多大区别。在ruby/rails中渲染大型XML集合的有效方法是什么?

我碰到的问题是渲染数组花费了大约200秒的时间,这对我来说似乎非常慢。我目前使用这样的代码:

def plistify(collection) 
    resultarray=Array.new() 
    collection.each do |entry| 
     hash= entry.attributes 
     hash["credits"]= entry.credits 
     hash["ratingcount"]= entry.ratings.count 
     hash["entryrating"]= entry.detail_rating 
     hash["entryratingcount"]= entry.entryratingcount 
     resultarray << hash 
    end 
    {'entries'=>resultarray}.to_plist 
    end 

然后被发送到客户端使用:

format.text {render :text => plistify(@entries)} 

,输出结果是这样的:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>entries</key> 
    <array> <-- corresponds to resultarray above 
     <dict> <-- corresponds to a single entry's attributes above. one of these per entry. 
      <key>cached_review_id</key> 
      <integer>190</integer> 
      <key>cached_tag_list</key> 
      <string>pub restaurant food waitress</string> 
      <key>created_at</key> 
      <date>2009-05-31T13:47:10Z</date> 
        ...about 20 key/values... 

等几乎所有开销在ruby'plistify'代码中 - 相比之下,数据库开销很小。

假设开销可能来自创建大量临时ruby对象,我试图用视图替换所有这些,并在视图中使用Builder来创建相同的XML文档 - 它的工作原理实际上是两倍的缓慢!

任何想法如何改善这一点,或以其他方式确定瓶颈?

+0

“to_plist”方法有什么作用? – 2009-08-07 16:40:56

+0

to_plist方法来自plist gem--它会自动将给定散列转换为字符串形式的plist(即q中显示的XML文档格式) – frankodwyer 2009-08-07 16:45:57

回答

1

不知道你是否可以做很多事情来改善这种情况,而不会在plist宝石本身中盗用。看看存储库中的源代码“svn checkout http://plist.rubyforge.org/svn/”和here它看起来像gem独立生成XML,而不是使用XML库(如LibXML,Nokogiri或builder)。

我不确定使用这些库中的一个库会在为您生成XML(它们肯定是解析速度更快)时会产生多大的差异,但它似乎是寻找优化机会的第一个合理位置。

相关问题